如何从命令输出中获取第二列?

Qia*_* Xu 131 shell awk ksh

我的命令输出类似于:

1540 "A B"
   6 "C"
 119 "D"
Run Code Online (Sandbox Code Playgroud)

第一列始终是数字,后跟空格,然后是双引号字符串.

我的目的是仅获得第二列,例如:

"A B"
"C"
"D"
Run Code Online (Sandbox Code Playgroud)

我打算用它<some_command> | awk '{print $2}'来完成这个.但问题是,第二列中的某些值包含空格,这恰好是分隔awk字段的默认分隔符.因此,输出搞砸了:

"A
"C"
"D"
Run Code Online (Sandbox Code Playgroud)

如何干净地获得第二列的值(带配对的引号)?

Ale*_*lex 175

使用-F [field separator]拆就行"S:

awk -F '"' '{print $2}' your_input_file
Run Code Online (Sandbox Code Playgroud)

或来自管道的输入

<some_command> | awk -F '"' '{print $2}'
Run Code Online (Sandbox Code Playgroud)

输出:

A B
C
D
Run Code Online (Sandbox Code Playgroud)

  • 你可以作弊,把awk的打印改为''{print"\""$ 2"\""}'` (5认同)
  • 这很好,但我也想要原始的周围引号.可以吗?谢谢. (3认同)

The*_*niK 77

如果您可以使用"awk"以外的其他内容,请尝试使用此功能

echo '1540 "A B"' | cut -d' ' -f2-
Run Code Online (Sandbox Code Playgroud)

-d是分隔符,-f是要切割的字段,使用-f2- 我们打算将第2个字段切割到结束.

  • 这很好,但是如果分隔符长度超过一个字符则不起作用.这就是awk解决方案派上用场的地方 (2认同)
  • 为什么在-d之后不使用空格?这样看起来有点奇怪。 (2认同)

hem*_*nto 37

这应该可以从命令输出"docker images"中获取特定列:

REPOSITORY                          TAG                 IMAGE ID            CREATED             SIZE
ubuntu                              16.04               12543ced0f6f        10 months ago       122 MB
ubuntu                              latest              12543ced0f6f        10 months ago       122 MB
selenium/standalone-firefox-debug   2.53.0              9f3bab6e046f        12 months ago       613 MB
selenium/node-firefox-debug         2.53.0              d82f2ab74db7        12 months ago       613 MB


docker images | awk '{print $3}'

IMAGE
12543ced0f6f
12543ced0f6f
9f3bab6e046f
d82f2ab74db7
Run Code Online (Sandbox Code Playgroud)

这将打印第三列

  • 你有没有看到 docker 图像的输出?awk '{print $5}' ? (2认同)

小智 28

或者使用sed和regex.

<some_command> | sed 's/^.* \(".*"$\)/\1/'
Run Code Online (Sandbox Code Playgroud)


ken*_*orb 15

你不需要awk.read在Bash shell中使用应该足够了,例如

some_command | while read c1 c2; do echo $c2; done
Run Code Online (Sandbox Code Playgroud)

要么:

while read c1 c2; do echo $c2; done < in.txt
Run Code Online (Sandbox Code Playgroud)


Chr*_*our 12

如果你有GNU awk这就是你想要的解决方案:

$ awk '{print $1}' FPAT='"[^"]+"' file
"A B"
"C"
"D"
Run Code Online (Sandbox Code Playgroud)