Voici une sed
approche:
$ sed -nE '1s/.{11}(.{8}).*/\1/p; 3s/.{3}(.{4}).*/\1/p' file
Ethernet
t6 a
Explication
Le -n
supprime la sortie normale (la normale consiste à imprimer chaque ligne d'entrée) de sorte qu'elle ne s'imprime que lorsque cela lui est demandé. Le -E
permet des expressions régulières étendues.
Le sed
script a deux commandes, toutes deux utilisant l'opérateur de substitution ( s/original/replacement/
). Le 1s/.{11}(.{8}).*/\1/p
ne fonctionnera que sur la 1ère ligne (c'est ce que 1s
fait), et correspondra aux 11 premiers caractères de la ligne ( .{11}
), puis il capture les 8 suivants ( (.{8})
, les parenthèses sont un "groupe de capture") et puis tout le reste jusqu'à ce que la fin de la ligne ( .*
). Tout cela est remplacé par tout ce qui était dans le groupe de capture ( \1
; s'il y avait un deuxième groupe de capture, ce serait \2
etc.). Enfin, le p
à la fin ( s/foo/bar/p
) provoque l'impression de la ligne une fois la substitution effectuée. Cela se traduit uniquement par la sortie des 8 caractères cibles.
La deuxième commande est la même idée générale sauf qu'elle ne s'exécutera que sur la 3ème ligne ( 3s
) et conservera les 4 caractères à partir de la 4ème.
Vous pouvez également faire la même chose avec perl
:
$ perl -ne 'if($.==1){s/.{11}(.{8}).*/\1/}
elsif($.==3){s/.{3}(.{4}).*/\1/}
else{next}; print; ' file
Ethernet
t6 a
Explication
Le -ne
moyen "lit le fichier d'entrée ligne par ligne et applique le script donné par -e
à chaque ligne. Le script est la même idée de base qu'auparavant. La $.
variable contient le numéro de ligne actuel, donc nous vérifions si le numéro de ligne est soit 1
ou 3
et et, si exécutez la substitution, sinon sautez. Par conséquent, le print
ne sera exécuté que pour ces deux lignes car toutes les autres seront ignorées.
Bien sûr, c'est Perl, donc TIMTOWTDI :
$ perl -F"" -lane '$. == 1 && print @F[11..19]; $.==3 && print @F[3..6]' file
Ethernet
t6 a
Explication
Ici, le -a
moyen "divise chaque ligne d'entrée sur le caractère donné par -F
et enregistre en tant que tableau @F
. Puisque le caractère donné est vide, cela enregistrera chaque caractère de la ligne d'entrée en tant qu'élément dans @F
. Ensuite, nous imprimons les éléments 11-19 ( les tableaux commencent à compter à 0
) pour la 1ère ligne et 3-7 pour la 3ème.