Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unix 搜索文件中最后一次出现的图案,并删除除图案线之外的所有内容_Unix_Sed_Awk_Html Table - Fatal编程技术网

Unix 搜索文件中最后一次出现的图案,并删除除图案线之外的所有内容

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

我试图搜索文件中最后出现的模式,并删除包含最后一个模式的行之后的所有内容。我想知道是否可以使用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 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