Unix 搜索文件中最后一次出现的图案,并删除除图案线之外的所有内容
我试图搜索文件中最后出现的模式,并删除包含最后一个模式的行之后的所有内容。我想知道是否可以使用awk或sed。提前谢谢Unix 搜索文件中最后一次出现的图案,并删除除图案线之外的所有内容,unix,sed,awk,html-table,Unix,Sed,Awk,Html Table,我试图搜索文件中最后出现的模式,并删除包含最后一个模式的行之后的所有内容。我想知道是否可以使用awk或sed。提前谢谢 aaaaaa bbbbb cccccc aaaaaa pattern dddddd eeeeee fffff gggg qqqq eeee rrrr 期望输出: aaaaaa bbbbb cccccc aaaaaa pattern dddddd tac救援: $ tac b | awk '/pattern/ {p=1}p' | tac aaaaaa bbbbb ccccc
aaaaaa bbbbb cccccc
aaaaaa pattern dddddd
eeeeee fffff gggg
qqqq eeee rrrr
期望输出:
aaaaaa bbbbb cccccc
aaaaaa pattern dddddd
tac
救援:
$ tac b | awk '/pattern/ {p=1}p' | tac
aaaaaa bbbbb cccccc
aaaaaa pattern dddddd
会连接并反向打印文件tac
代码在我对您上一个问题的回答中进行了解释awk
$ cat a
aaaaaa bbbbb cccccc
aaaaaa pattern dddddd
eeeeee fffff gggg
aaaaaa pattern dddddd
qqqq eeee rrrr
$ tac a | awk '/pattern/ {p=1}p' | tac
aaaaaa bbbbb cccccc
aaaaaa pattern dddddd
eeeeee fffff gggg
aaaaaa pattern dddddd
要演示上述后缀的工作原理(请参见下面的注释):
我有这一行,应该符合您的要求:
awk '/pattern/{_=NR}{a[NR]=$0}END{for(i=1;i<=_;i++)print a[i]}' file
awk'/pattern/{{unr=NR}{a[NR]=$0}END{for(i=1;i这可能对您有用(GNU-sed):
@fedorqui我也发现了…现在它应该给出正确的东西。i@user2809888@Jotne你可以肯定有自己的观点。我同意你的看法,\uu
看起来不像其他常见的var名称,易于阅读,但就个人而言,我认为这个答案不值得否决,即使它可以写得更好。1)它可以工作2)角落案例也被考虑3)\uu
在awk中是一个有效的变量名。也就是说,我们可以使用它。4)\u
是下划线,对我来说它看起来像一个文件中的最后一行。所以我使用了它。你也可以投票否决awk
吗(如果可以的话)由于awk允许一个名为\uu
的var,或者您可以建议,我们什么时候应该使用var名称\u
?我不能删除下一票。我同意这是一个有效字符,但简单的b
就可以了。另外:tac a | sed-n'/pattern/,$p'/tac
如果我想搜索第一个模式并删除上面的所有内容,包括模式行?@user2809888这是你之前问过的问题:我总是可以从你的答案中学到东西,我想这次也是。你能解释一下begin块吗?我知道这里我们想通过附加一个ARGV来读取输入文件两次。但是这行我不明白:ARGV[ARGC++]=ARGV[ARGC-1]
比方说,我们有awk'.'文件
然后我们有ARGC=2;V[0]=awk;V[1]=文件
现在我们做V[ARGC++].
然后我们分配V[2]=一些东西
现在ARGC
是3。右边的ARGV[ARGC-1]
实际上是V[3-1]
但是V[2]
为空。为什么ARGC++
之后没有更改ARGC
?@Kent唯一“棘手”的部分是++
是后缀运算符,因此在计算整个语句之后才会出现,因此它相当于ARGV[ARGC]=ARGV[ARGC-1];ARGC++
,即ARGC保留其原始值,直到赋值之后。@Kent我更新了我的答案,只是为了用一个小脚本演示postifx是如何工作的。非常感谢,我刚刚对它进行了一点测试awk'BEGIN{x=5;a[x++]=x;print a[5]}“
它打印了5,而不是6。它很有趣。不像其他编程语言。很高兴知道。谢谢你的回答和解释。+1,++1;)我怀疑这种差异可能与解释性语言和编译性语言有关。如果我能让我的awkcc
工作,那将是一个有趣的测试!
$ awk 'BEGIN{ i=3; a[i++] = i; for (j in a) print j, a[j]; print i }'
3 3
4
awk '/pattern/{_=NR}{a[NR]=$0}END{for(i=1;i<=_;i++)print a[i]}' file
kent$ cat f
aaaaaa bbbbb cccccc
aaaaaa pattern dddddd
eeeeee fffff gggg
qqqq eeee rrrr
aaaaaa pattern dddddd
111
222
kent$ awk '/pattern/{_=NR}{a[NR]=$0}END{for(i=1;i<=_;i++)print a[i]}' f
aaaaaa bbbbb cccccc
aaaaaa pattern dddddd
eeeeee fffff gggg
qqqq eeee rrrr
aaaaaa pattern dddddd
sed -r '/pattern/{x;/./p;d};x;/./!{x;b};x;H;$!d;x;P;d' file