Shell 有选择地使用';grep——上下文之后';一个任期,但不是另一个任期
我从网络中提取大量数据并过滤Shell 有选择地使用';grep——上下文之后';一个任期,但不是另一个任期,shell,unix,sed,awk,grep,Shell,Unix,Sed,Awk,Grep,我从网络中提取大量数据并过滤foo和bar,例如 for i in example.com example.org example.net do echo "Data from $i" curl $i/data.csv | grep --after-context=3 "foo|bar" done 每次出现foo时,我都需要看到接下来的几行(grep--after context=3),但当出现bar时,我只需要那一行 是否可以使用单个grep、sed、awk(或其他标准u
foo
和bar
,例如
for i in example.com example.org example.net
do
echo "Data from $i"
curl $i/data.csv | grep --after-context=3 "foo|bar"
done
每次出现foo
时,我都需要看到接下来的几行(grep--after context=3
),但当出现bar
时,我只需要那一行
是否可以使用单个grep
、sed
、awk
(或其他标准unix)命令使其工作?单向:
curl .... | awk '/foo/{x=NR+3}(NR<=x) || /bar/'
curlawk'/foo/{x=NR+3}(NR单向:
curl .... | awk '/foo/{x=NR+3}(NR<=x) || /bar/'
curl…| awk'/foo/{x=NR+3}(NR
您可以使用上面的选项,而不是grep
。它的作用是:
在BEGIN
中设置非打印变量
/bar/{print}
如果您无法理解这一点,那么……(下一个用于跳过其他规则并移动到下一条记录)
/foo/{np=1;ln=RN;print}
打印foo
行,保存行号,并设置以后的打印行
如果实际行号大于保存的行号加3,则将打印设置为关闭
如果需要打印(np>0
),请打印
您可以使用上面的选项,而不是grep
。它的作用是:
在BEGIN
中设置非打印变量
/bar/{print}
如果您无法理解这一点,那么……(下一个用于跳过其他规则并移动到下一条记录)
/foo/{np=1;ln=RN;print}
打印foo
行,保存行号,并设置以后的打印行
如果实际行号大于保存的行号加3,则将打印设置为关闭
如果需要打印(np>0
),请打印
这可能适合您(GNU sed)
这可能适合您(GNU sed)
我将上师的答案标记为“正确”答案是因为它很简单,而不是因为你的答案没有用-谢谢!我将上师的答案标记为“正确”答案是因为它很简单,而不是因为你的答案没有用-谢谢!谢谢!非常有效。现在开始嵌套if:)谢谢!非常有效。现在开始嵌套if:)
sed -n '/foo/,+3{p;b};/bar/p' file