Вот sedподход:
$ sed -nE '1s/.{11}(.{8}).*/\1/p; 3s/.{3}(.{4}).*/\1/p' file
Ethernet
t6 a
объяснение
-nПодавляет нормальный выход (нормаль печатать каждую строку ввода) , так что он печатает только тогда , когда велено. -EПозволяет расширенные регулярные выражения.
В sedскрипте есть две команды, каждая из которых использует оператор подстановки ( s/original/replacement/). Функция 1s/.{11}(.{8}).*/\1/pбудет работать только на 1-й строке (это то, что 1sделает) и будет соответствовать первым 11 символам строки ( .{11}), затем она захватывает следующие 8 ( (.{8})скобки являются «группой захвата»), а затем все остальное до конец строки ( .*). Все это заменяется тем, что было в группе захвата ( \1если бы была вторая группа захвата, это было бы \2и т. Д.). Наконец, pв конце ( s/foo/bar/p) вызывается печать строки после замены. В результате выводятся только целевые 8 символов.
Вторая команда - это та же общая идея, за исключением того, что она будет выполняться только в 3-й строке ( 3s) и сохранит 4 символа, начиная с 4-й.
Вы также можете сделать то же самое с perl:
$ perl -ne 'if($.==1){s/.{11}(.{8}).*/\1/}
elsif($.==3){s/.{3}(.{4}).*/\1/}
else{next}; print; ' file
Ethernet
t6 a
объяснение
Это -neозначает «читать входной файл построчно и применять сценарий, заданный -eдля каждой строки. Этот сценарий является той же базовой идеей, что и раньше. $.Переменная содержит текущий номер строки, поэтому мы проверяем, является ли номер строки либо, 1либо, 3и если» Итак, запустите подстановку, иначе пропустите. Поэтому printбудет выполняться только для этих двух строк, так как все остальные будут пропущены.
Конечно, это Perl, поэтому TIMTOWTDI :
$ perl -F"" -lane '$. == 1 && print @F[11..19]; $.==3 && print @F[3..6]' file
Ethernet
t6 a
объяснение
Здесь -aозначает «разбить каждую входную строку на символ, заданный -Fи сохранить как массив @F. Поскольку данный символ пустой, это сохранит каждый символ строки ввода как элемент в @F. Затем мы печатаем элементы 11-19 ( массивы начинают считать с 0) для 1-й строки и 3-7 для 3-й.