可以改用awk吗?

San*_*dra 17 linux bash grep awk

我想从中获取数字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
Run Code Online (Sandbox Code Playgroud)

我可以这样做

# nc localhost 9571 | grep rating | cut -d: -f2
94
Run Code Online (Sandbox Code Playgroud)

但可以awk用来代替更简单的解决方案吗?

qua*_*nta 32

$ nc localhost 9571 | awk -F: '/rating/ { print $2 }'
Run Code Online (Sandbox Code Playgroud)

  • 如果任何字段值或名称包含字符串“rating”,即其中一个会话名称中包含“rating”一词,则可能会给出错误的结果。更好:`awk -F: '$1 == "rating" {print $2}'` (7认同)
  • 或者也许`awk -F: '/^rating:/ { print $2 }'`? (3认同)

Sma*_*ger 14

Quanta 击败了我,但sed如果您愿意,我会提供一个变体:

nc localhost 9571 | sed -ne 's/^rating://p'
Run Code Online (Sandbox Code Playgroud)

尽管如此,MadHatter 所说的也是如此。您当前的解决方案非常合理。(虽然我会用 grep"^rating:"而不仅仅是单词来确保你只得到你想要的行。)


gle*_*man 9

您也可以只使用外壳:

nc localhost 9571 | 
while IFS=: read key val; do [[ $key = "rating" ]] && echo "$val"; done
Run Code Online (Sandbox Code Playgroud)


Mic*_*jer 7

是的,您可以(并且应该)使用(一个)awk 而不是(两个)grep 和 cut:

$ nc localhost 9571 | awk -F: '/^rating:/ { print $2 }'
Run Code Online (Sandbox Code Playgroud)

确保尽可能匹配您的线路,以避免出现丑陋的错误。

  • /rating/ 作品,
  • /^rating/ 更好(更安全),
  • /^rating:/ 最好(在这种情况下)。