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循环。但这只是一个非常小的优化。埃德默顿的回答应该对你有用。