我有一个这样的文件:
string log 1
string log 2
string match
string log 4
string match
string log 5
string log 6
我需要在最后一个字符串匹配后获取所有行。我怎么能用bash来做呢?
答案 0 :(得分:5)
我将假设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
答案 1 :(得分:5)
首先,找到最后一个字符串匹配:
line=$(grep -n 'string match' myFile | cut -d: -f1 | tail -1)
然后,将所有行打印到最后一个字符串匹配:
sed -n "1,${line}p" myFile
如果您在上次比赛后需要所有线路:
sed -n "$((line+1))"',$p' myFile
答案 2 :(得分:2)
awk
解决方案:$ awk 'FNR==NR{if(/match/)x=NR; next}; FNR>x' input.txt{,}
string log 5
string log 6
答案 3 :(得分:1)
这可能对您有用:
sed 'H;/string match/,+1h;$!d;x' file
答案 4 :(得分:0)
我个人会使用这种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