Ecco un sed
approccio:
$ sed -nE '1s/.{11}(.{8}).*/\1/p; 3s/.{3}(.{4}).*/\1/p' file
Ethernet
t6 a
Spiegazione
L' -n
uscita normale sopprime (normale è quello di stampare ogni linea di ingresso) in modo che la stampa solo quando ha detto di. L' -E
abilita le espressioni regolari estese.
Lo sed
script ha due comandi, entrambi utilizzano l'operatore di sostituzione ( s/original/replacement/
). L' 1s/.{11}(.{8}).*/\1/p
verrà eseguito solo sulla linea 1 (che è quello che la 1s
fa), e corrisponderà al primo 11 caratteri della linea ( .{11}
), quindi cattura i prossimi 8 ( (.{8})
le parentesi sono un "gruppo di cattura") e poi tutto il resto fino a quando la fine della linea ( .*
). Tutto questo viene sostituito con qualsiasi cosa fosse nel gruppo di acquisizione ( \1
; se ci fosse un secondo gruppo di acquisizione, sarebbe \2
ecc.). Infine, p
alla fine ( s/foo/bar/p
) fa sì che la riga venga stampata dopo aver effettuato la sostituzione. Ciò si traduce in un output di soli 8 caratteri target.
Il secondo comando è la stessa idea generale, tranne per il fatto che verrà eseguito solo sulla 3a riga ( 3s
) e manterrà i 4 caratteri a partire dalla 4a.
Puoi anche fare la stessa cosa con perl
:
$ perl -ne 'if($.==1){s/.{11}(.{8}).*/\1/}
elsif($.==3){s/.{3}(.{4}).*/\1/}
else{next}; print; ' file
Ethernet
t6 a
Spiegazione
Il -ne
mezzo "legge il file di input riga per riga e applica lo script fornito da -e
ciascuna riga. Lo script è la stessa idea di base di prima. La $.
variabile contiene il numero di riga corrente, quindi controlliamo se il numero di riga è o 1
o 3
e, se quindi, esegui la sostituzione, altrimenti salta. Pertanto print
verrà eseguito solo per quelle due righe poiché tutte le altre verranno ignorate.
Certo, questo è Perl, quindi TIMTOWTDI :
$ perl -F"" -lane '$. == 1 && print @F[11..19]; $.==3 && print @F[3..6]' file
Ethernet
t6 a
Spiegazione
Qui, i -a
mezzi "suddividono ogni riga di input sul carattere dato da -F
e salvano come matrice @F
. Poiché il carattere fornito è vuoto, ciò salverà ogni carattere della riga di input come elemento in @F
. Quindi, stampiamo gli elementi 11-19 ( le matrici iniziano a contare da 0
) per la 1a riga e 3-7 per la 3a.