Awk 打印两种图案之间的线条并休眠一秒钟,然后重复,直到EOF

Awk 打印两种图案之间的线条并休眠一秒钟,然后重复,直到EOF,awk,sed,pattern-matching,sleep,Awk,Sed,Pattern Matching,Sleep,问题的第一部分有很多答案,那就是在两种图案之间打印线条。例如: awk '/start/{flag=1} flag; /end/{flag=0}' file 这将打印出在“文件”中多次出现的模式“开始”和“结束”之间的行。假设该文件包含: start a b c d 4 5 3 7 8 end some garbage start 6 d 0 0 1 d g end other garbages start 6 5 ... end some other garbage 上面的“awk”命令打

问题的第一部分有很多答案,那就是在两种图案之间打印线条。例如:

awk '/start/{flag=1} flag; /end/{flag=0}' file
这将打印出在“文件”中多次出现的模式“开始”和“结束”之间的行。假设该文件包含:

start a b c d 4 5 3 7 8 end some garbage start 6 d 0 0 1 d g end other garbages start 6 5 ... end some other garbage
上面的“awk”命令打印出整个文件,消除垃圾。。这很好,但我想要的是在每一块之间暂停。那是印刷品

开始b c d 4 5 3 7 8结束

睡眠一秒钟(
sleep 1
),然后打印下一个区块:

start 6 d 0 0 1 d g end

依此类推,直到文件结束。我进行了大量搜索,但没有找到第二个“暂停/等待”部分,因此我相信这不是一个重复的问题。

使用GNU awk进行多字符搜索:

$ cat tst.awk
BEGIN { RS="[[:space:]]+"; ORS=" " }
/start/ { found=1 }
found   { print }
/end/   { printf "\n"; found=0; system("sleep 1") }

$ time awk -f tst.awk file
start a b c d 4 5 3 7 8 end
start 6 d 0 0 1 d g end
start 6 5 ... end

real    0m3.214s
user    0m0.015s
sys     0m0.122s

请注意,变量名应该是
found
或类似有意义的单词,而不是
flag
,因为标志是变量的类型,而不是它所代表的内容。命名标志变量
flag
就像命名整型变量
integer
,而不是
count
sum
或其他有意义的东西。

使用
系统(“睡眠1”)
的另一种替代方法是在
循环时将awk的输出导入bash

awk ... | while read -r line ; do
    echo "${line}"
    sleep 1
done

这将避免为每个睡眠操作生成一个额外的shell。

您确定awk脚本正在执行您所说的操作吗?澄清一下,鉴于您的示例数据,它对我不起作用,如果没有for循环来迭代记录中的字段,我看不出它将如何工作。如果实现了for循环,那么在
/END/
测试中,可以在循环进入下一个字段之前实现
系统(“睡眠10”)
。但这是一个没有实际意义的观点,因为脚本似乎没有完成它应该做的事情。@jnevil实际上你是对的,它打印出了整个文件。但无论如何,我对awk命令不感兴趣,这只是一个例子。我在问题中描述了我想要的。嗨,它仍然可以一次打印出所有内容!我想要匹配这两种模式(开始和结束)的东西,打印出一个这样的块,暂停一秒钟,然后找到下一个块等等。不,它没有,它完全按照我的答案中显示的那样做。如果您有不同的体验,那么您的实际输入与发布的输入不匹配,或者您没有使用gawk。我看不到“开始”和“结束”模式在任何地方使用,但至少它打印出单行,因此对我很有用,尽管我发现了另一个与您非常类似的解决方案:
#/当IFS=''读取-r行| |[[-n“$line”]]时,bin/bash;执行echo“$line”sleep 1 done<“$1”
非常感谢。我的意思是,使用EdMorten的awk脚本,从中删除
系统(“sleep 1”)
,并将其传输到while循环。但这只是一个非常小的优化。埃德默顿的回答应该对你有用。