我在linux中有一个文本文件(基本上是一个日志文件),我有两个单词(alpha,beta)。
现在我试图在一行中搜索这两个单词,然后在临时文件中打印该行和接下来的15行。有很多行有alpha和beta但是我只需要最后一次出现“alpha”和“beta”以及接下来的15行。
如果你在命令数量增加的情况下告诉我命令我会感激不尽,比如在同一行搜索3或4个单词,alpha,beta,gamma
答案 0 :(得分:5)
你的措辞有点含糊不清,你想要一个同时具有alpha和beta或alpha OR beta的行。如果是第一个:
grep -EA15 'alpha.*beta|beta.*alpha' | tail -16
如果第二个:
grep -wA15 'alpha|beta' | tail -16
答案 1 :(得分:1)
只要你坚持每行2个单词,OmnipotentEntity绝对是你的选择。然而,由于正则表达式中的组合爆炸,它实际上并没有真正扩展。如果你需要在一行中匹配4或5个单词,我认为下面的内容将无法调整(我只是部分测试过):
#!/bin/bash
context=15
file=$1
shift
cmd="cat -n $file"
for s in $@
do
cmd="$cmd | grep $s"
done
begin=$(eval $cmd | tail -1 | cut -f1)
(( end=$begin + $context ))
sed -n $begin,${end}p $file
我们的想法是将行号附加到输入文件,然后构建一系列grep过滤器。我们提取通过所有过滤器的最后一行的行号,并使用sed打印出所需的范围。
答案 2 :(得分:1)
这可能适合你(GNU sed):
sed '/alpha.*beta\|beta.*alpha/,+15{//{h;d};H};$!d;g;/^$/d' file
或者这(所有sed):
sed '/alpha.*beta\|beta.*alpha/{:a;$bb;N;s/\n/&/15;tb;ba;:b;$q;x};$!d;g;/^$/d' file
有两个单词,正则表达式/alpha.*beta\|beta.*alpha/
是可以接受的,但从那里开始记住所有不同的组合会变得更加棘手。如果该行不包含当前的正则表达式,更好的方法是在任何一点将单词列为单独的正则表达式:
sed '/alpha/!bc;/beta/!bc;/gamma/!bc;/delta/!bc;:a;$bb;N;s/\n/&/15;tb;ba;:b;$q;x;d;:c;$!d;g;/^$/d' file
答案 3 :(得分:0)
请参阅以下代码:
awk '
{
file[NR]=$0
}
END{
for (i=NR; i>0; i--) {
if (file[i] ~ /^alpha, beta/) {
for (j=i; j<=i+15; j++) {
print file[j]
}
exit
}
}
}
' FILE
算法是:
答案 4 :(得分:0)
您也可以使用sed:
sed -n '/alpha.*beta|beta.*alpha/,+15p' file | tail -n 16
答案 5 :(得分:-2)
获取特定单词的最后一次出现:“tail”
grep myword myfile.txt| tail -1
对于多个单词,
grep -w 'word1|word2' myfile.txt| tail -1
对于任何一个单词的最后15个实例,
grep -w 'word1|word2' myfile.txt| tail -15
对于更复杂的场景:“sed”或“awk”。