2016-08-04 9 views

Antwort

2

Eine Möglichkeit, GNU diese Weise sed zu verwenden wäre:

sed -n '10,$ {/foo/{=; q}}' abc.text 

Das heißt:

  • Im Bereich von Linie 10 bis zum Ende
  • -> Für eine Linie passend foo
  • -> die Zeilennummer drucken und dann

einige Tests die Richtigkeit demonstrieren die Verarbeitung stoppen:

{ for i in {1..9}; do echo $i; done; echo foo; echo bar; echo foo; } | \ 
sed -n '10,$ {/foo/{=; q}}' 
# correctly prints 10 

{ for i in {1..9}; do echo $i; done; echo x; echo foo; echo bar; echo foo; } | \ 
sed -n '10,$ {/foo/{=; q}}' 
# correctly prints 11 

{ for i in {1..9}; do echo $i; done; } | \ 
sed -n '10,$ {/foo/{=; q}}' 
# correctly prints nothing 
+1

'für i in {1..9}; echo $ i; done' == 'seq9' – karakfa

+0

' seq' ist nicht tragbar und nicht zu empfehlen – janos

2

Sie könnten versuchen:

awk 'NR>=10 && $0~/foo/ {print NR; exit}' abc.text 

Erläuterungen:

  • NR ist die Zeilennummer, nur Linien mit der Nummer >=10 wird
  • in Betracht gezogen werden, wenn Sie die Nummer der Ausgangsleitung wollen, dass die ignorieren erste 9 Zeilen, print NR-9
  • $0~/foo/ ist Standardmusterabgleich in awk
  • die exit wird die Verarbeitung beim ersten Auftreten zu stoppen
0

Das für einige Nutzer besser lesbar sein:

tail -n +10 abc.txt | grep -n foo | head -1 | cut -f1 '-d:'

+1

Sie müssten 9 zur Antwort hinzufügen. –

+1

Ich habe nicht daran gedacht. Ich schätze, es kommt darauf an, wie du die Frage liest. –

Verwandte Themen