2009-09-24 17 views
10

Ho un file enorme sul mio server UNIX da cui ho bisogno di estrarre alcune partiottenere una parte di una linea dopo grep

Il formato della linea è

aNumber timestamp commandInformation 

Io uso il comando

grep LATENCY file.log | grep CMDTYPE=NEW 

per filtrare determinate righe che desidero. Voglio solo il timestamp della parte e gli ultimi 9 caratteri della riga da restituire, non la linea completa. Come lo posso fare?

risposta

10

Uso awk(1):

awk ' { print $2" "substr($0,length($0)-8) }' 
+1

+1 per essere stato più veloce di me :) –

1

È possibile utilizzare awk come segue:

grep LATENCY file.log | grep CMDTYPE=NEW | awk '{print $2,substr($0,length($0)-9,9)}' 
+0

Non sarebbe utilizzando $ 0 assicurarsi di visualizzare alla fine della linea anziché solo alla fine della 3a parola? –

+0

@Yannick: sì, ho assunto senza motivo che 'commandInformation' sarebbe solo una parola. Risolto il post con il tuo suggerimento, grazie! –

0

Non c'è bisogno di usare grep, awk può fare anche questo:

awk '/LATENCY/ && /CMDTYPE=NEW/ {print $2 " " substr($0, length($0)-8)}' file 
2

I' sto andando a discutere perl è una scelta migliore di awk qui:

perl -ne 'next if ! (/LATENCY|CMDTYPE=NEW/ && /^\d+.*\s+(.*)\s+.*(.{9})$/); print "$2 $3\n";' 

Il regex è più robusto, consentendo di omettere le linee che non corrispondono al modello più rigoroso. Gli script awk mostreranno overflow nella sottostringa (onestamente non so cosa fanno gli awk negativi in ​​awk) se gli dai un input spezzato come le linee parziali dalla fine di un log.

0

Si può fare tutto da solo con sed:

 
$ echo "234432 12:44:22.432095 LATENCY blah CMDTYPE=NEW foo bar 123456789" | \ 
sed -n '/LATENCY/!b;/CMDTYPE=NEW/!b;s/^.\+\s\+\([0-9:.]\+\)\s.\+\(.........\)$/\1 \2/; p' 
12:44:22.432095 123456789 
9

cut deve fare il lavoro

grep something somewhere | grep againsomething | cut -f2 -d' ' 
Problemi correlati