我想从这里得到rating的数字作为输出
# nc localhost 9571 language: language:en_ZA.UTF-8 language:en_ZW.UTF-8 session-with-name:Ubuntu Classic (No effects):gnome-session --session=2d-gnome session-with-name:Ubuntu (Safe Mode):gnome-session -f --session=2d-gnome session-with-name:Ubuntu Classic:gnome-session --session=classic-gnome xsession:/etc/X11/Xsession rating:94
我可以这样做
# nc localhost 9571 | grep rating | cut -d: -f2 94
但可以用awk来代替更简单的解决scheme?
$ nc localhost 9571 | awk -F: '/rating/ { print $2 }'
广达打败了我,但我会包括一个sed变体,如果你是这样的倾向:
nc localhost 9571 | sed -ne 's/^rating://p'
同样,MadHatter也说过。 你目前的解决scheme是完美的。 (虽然我会grep为"^rating:"而不是只是这个词,以确保你只得到你想要的行。)
你也可以使用shell:
nc localhost 9571 | while IFS=: read key val; do [[ $key = "rating" ]] && echo "$val"; done
是的,你可以(而且应该)使用(一个)awk而不是(两个)grep和cut:
$ nc localhost 9571 | awk -F: '/^rating:/ { print $2 }'
一定要尽可能匹配你的线,以避免丑陋的错误。
/rating/作品, /^rating/更好(更安全), /^rating:/是最好的(在这种情况下)。 它可以:
nc localhost 9571 | awk -F: '{ if ($1 == "rating") print $2 }'
(我不知道你在做什么与上面的localhost,所以用你的输出作为我的awk命令的input,然后用“NC …”replace“猫” – 但它应该没问题。)
但是,你为什么要这样做? UNIX的方式是有许多小工具,每个小工具都通过stream水线连接在一起,而不是使用更大的多function工具。 您需要select一个匹配行,从中select一个字段: grepselect具有匹配的行,并从input行中select字段; 他们是完美的任务。 但是,如果你真的想用awk做到这一切,那么你就去。
虽然Quanta的答案是最简单的,我也会写,我敢打赌你不知道GNU awk(gawk)也可以联网吗? 如果你真的想要,你可以用awk写出整个东西:
BEGIN { FS = ":" f = "/inet/tcp/0/127.0.0.1/9571" while ((f |& getline) > 0) if ($1 ~ /^rating$/) {print $2} }
这可能是有用的,如果一个服务器没有安装NC,NC有限制烫发,或者如果你真的像awk。
你也可以使用sed,
nc localhost 9571 | sed -n "s/^rating:\([\d]*\)/\1/p"
这将确保“评级”开始行,并且数字遵循rating:
如果Perl是一个选项:
nc localhost 9571 | perl -F: -lane 'print $F[1] if /rating/'
-a将每行自动插入@F数组
-F:使用:作为字段分隔符,而不是默认的空格
/rating/如果find正则expression式则返回true
$F[1]是@F数组的第二个元素。
Perl数组以元素0开头,而awk以$ 1开头