Как получить все строки после номера строки - PullRequest
5 голосов
/ 14 февраля 2012

У меня есть такой файл:

string log 1 
string log 2
string match
string log 4
string match
string log 5
string log 6

Мне нужно получить все строки после последнего совпадения строк.Как я могу сделать это в Bash?

Ответы [ 5 ]

5 голосов
/ 14 февраля 2012

Сначала найдите последнее совпадение строки:

line=$(grep -n 'string match' myFile | cut -d: -f1 | tail -1)

Затем напечатайте все строки до последнего совпадения строки:

sed -n "1,${line}p" myFile

Если вам нужны все строки после последнего совпадения:

sed -n "$((line+1))"',$p' myFile
5 голосов
/ 14 февраля 2012

Я собираюсь предположить, что в bash допускает некоторые внешние двоичные вызовы.С учетом этого:

Все строки после последнего матча

tac infile | sed '/string match/,$d' | tac

Вывод

$ tac infile | sed '/string match/,$d' | tac
string log 5
string log 6

Все строки до последнего матча

tac infile | sed '1,/string match/d' | tac

Вывод

$ tac infile | sed '1,/string match/d' | tac
string log 1
string log 2
string match
string log 4
2 голосов
/ 14 февраля 2012

awk решение:

$ awk 'FNR==NR{if(/match/)x=NR; next}; FNR>x' input.txt{,}
string log 5
string log 6
1 голос
/ 14 февраля 2012

Это может работать для вас:

sed 'H;/string match/,+1h;$!d;x' file
0 голосов
/ 23 сентября 2013

Я бы лично использовал этот метод sed:

-bash-4.1$ cat file | sed -n 'H; /string match/h; ${g;p;}'
string match
string log 5
string log 6
-bash-4.1$ cat file | sed -n 'H; /string match/h; ${g;p;}' | grep -v 'string match'
string log 5
string log 6
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...