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
Shell 有选择地使用';grep——上下文之后';一个任期,但不是另一个任期_Shell_Unix_Sed_Awk_Grep - Fatal编程技术网

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