![提取包含包含制表符的精确短语的行](https://linux22.com/image/130637/%E6%8F%90%E5%8F%96%E5%8C%85%E5%90%AB%E5%8C%85%E5%90%AB%E5%88%B6%E8%A1%A8%E7%AC%A6%E7%9A%84%E7%B2%BE%E7%A1%AE%E7%9F%AD%E8%AF%AD%E7%9A%84%E8%A1%8C.png)
我有一个包含以下几行的文件
50[tab]H[tab]1
44[tab]H[tab]2
4[tab]H[tab]3
4[tab]H[tab]4
44[tab]H[tab]5
234[tab]H[tab]6
我只想将以确切短语“4[tab]H”开头的最后一行(因此这将是“4[tab]H[tab]4”)提取到另一个文件中。我努力了:
grep "^4*.H" filein.in | tail -1 >> fileout.out
但它提取“44[tab]H[tab]5”。我需要它来提取以确切的字符串开头的最后一行:“4[tab]H”。
答案1
在 ksh93/zsh/bash/mksh/FreeBSD sh 中:
grep $'^4\tH' filein.in | tail -n 1
或者在任何 shell 中:
awk '/^4\tH/ { line=$0; }; END { if(line!="") print line; }' filein.in
答案2
使用 gnu sed
sed '/^4\tH/h;$bA;N;D;:A;x;/^$/d' infile
答案3
您还可以使用 逐行反转输入文件tac
,然后获取第一个匹配项
$ # add another \t after H if needed
$ tac ip.txt | grep -m1 $'^4\tH'
4 H 4
$ tac ip.txt | awk -F'\t' '$1=="4" && $2=="H"{print; exit}'
4 H 4