我有一个程序,准确地说是“wimaxcu scan”,它以如下格式输出数据:
network A
frequency
signal strength
noise ratio
network B
frequency
signal strength
noise ratio
etc....
程序可以输出大量元素。我只对一个特定网络的一些属性感兴趣,例如网络J.我想写一个bash脚本,它将J的信号强度和噪声比放在指定文本文件中的新行上我运行脚本的时间。所以在多次运行脚本后,我会有一个看起来像这样的文件:
Point 1 signal_strength noise_ratio
Point 2 signal_strength noise_ratio
Point 3 signal_strength noise_ratio
etc...
我被建议将输出通过管道传输到grep来实现这一目标。我很确定grep不是实现这一目标的最佳方法,因为我想要抓取的线与其他噪声和信号强度线无法区分。我认为必须识别“网络J”模式(它是唯一的),然后抓住找到的模式之后的第2和第3行。
我的问题是其他人会如何建议我实施这样的脚本。我对bash不太熟悉,所以最简单的方法是值得赞赏的,而不是复杂但有效的方法。
答案 0 :(得分:2)
用awk!
如果您的数据位于名为“data”的文件中,您可以在命令行中执行此操作:
$ awk -v RS='\n\n' -v FS='\n' '{ print $1,$3,$4 }' data
这样做是将“记录分隔符”设置为两个换行符,将“字段分隔符”设置为单个换行符,然后从每个数据集中打印一个,三个和四个字段。
Awk,如果你不熟悉,可以使用记录进行操作,并且可以使用它们执行各种操作。所以这简单地说“记录看起来像这样,并以这种方式打印。”具体来说,“A记录具有由换行符分隔的字段,每个记录由两个连续的换行符分隔。为每个记录打印这些记录的第一,第三和第四个字段。”
编辑:正如Jo So(完全阅读并理解了您要求的内容)所指出的那样,您可以在花括号内部添加if语句来指定特定网络。或者,如果它是唯一的,你可以在最后输入一个管道来grep。但是他的解决方案更正确,因为它只会匹配第一个字段!
$ awk -v RS='\n\n' -v FS='\n' '{ if ($1 == "Network J") print $1,$3,$4 }' data
答案 1 :(得分:2)
要完成Dan Fego的非常好的答案(对不起,我似乎还不允许发表评论),请考虑一下:
awk -v RS='\n\n' -v FS='\n' '{if ($1 == "network J") print $3}' data
这实际上是一段非常强大的代码。
答案 2 :(得分:1)
实际上Grep是正确的选择。
您需要做的是使用grep的-A(after)和-B(before)选项。你可以使用类似的东西:
grep "network J" -A 3 original_output
这将输出网络J之后的3行,包括线路网络J.但你不想要“网络J”这样的话
grep "network J" -A 3 original_output | grep -v "network J"
然后你必须将它们放在一行中,这可以通过回显输出来轻松完成:。
echo $(grep "network J" -A original_output | grep -v "network J")
现在,您将在文件中结束所有Network J实例。你可以将它们附加到输出
echo $(grep "network J" -A original_output | grep -v "network J") >> net_j_report.txt
将Point 1 ...等添加到开头可以稍后通过:
完成 grep -v '^[[:space:]]*$' net_j_report.txt | cat -n | sed -e 's/^/Point /'
这里grep -v删除任何意外的空行,cat -n添加行号,最后一个sed语句将Point放在开头。
所以将A部分和B部分结合起来瞧。
答案 3 :(得分:0)
这可能对您有用:
# cat file1 # same format for file2, file3, ...
network A
frequency
signalA strength
noise1 ratio
network B
frequency
signalB strength
noise1 ratio
# sed -n '/network/{s/network \(.\)/cat <<\\EOF >>\1/p;n;n;N;y/ /_/;s/\n/ /;s/$/\nEOF/p}' file1 | sh
# sed -n '/network/{s/network \(.\)/cat <<\\EOF >>\1/p;n;n;N;y/ /_/;s/\n/ /;s/$/\nEOF/p}' file2 | sh
# sed -n '/network/{s/network \(.\)/cat <<\\EOF >>\1/p;n;n;N;y/ /_/;s/\n/ /;s/$/\nEOF/p}' file3 | sh
# sed -i = A
# sed -i 'N;s/^/Point /;s/\n/ /' A
# sed -i = B
# sed -i 'N;s/^/Point /;s/\n/ /' B
# cat A
Point 1 signalA_strength noise1_ratio
Point 2 signalA_strength noise2_ratio
Point 3 signalA_strength noise3_ratio
# cat B
Point 1 signalB_strength noise1_ratio
Point 2 signalB_strength noise2_ratio
Point 3 signalB_strength noise3_ratio