188

我的命令的输出类似于:

1540 "A B"
   6 "C"
 119 "D"

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

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

"A B"
"C"
"D"

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

"A
"C"
"D"

如何干净地获取第二列的值(带有成对的引号)?

4

8 回答 8

241

用于-F [field separator]分割"s 上的行:

awk -F '"' '{print $2}' your_input_file

或从管道输入

<some_command> | awk -F '"' '{print $2}'

输出:

A B
C
D
于 2013-04-21T22:51:46.110 回答
97

如果您可以使用 'awk' 以外的其他内容,请尝试使用此方法

echo '1540 "A B"' | cut -d' ' -f2-

-d是分隔符,-f是要剪切的字段,使用-f2- 我们打算剪切第二个字段直到结束。

于 2013-07-30T09:41:32.903 回答
68

这应该可以从命令输出“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

这将打印第三列

于 2017-05-03T15:03:02.683 回答
33

或使用 sed 和正则表达式。

<some_command> | sed 's/^.* \(".*"$\)/\1/'
于 2013-04-21T22:57:17.963 回答
21

你不需要 awk 。在 Bash shell 中使用read就足够了,例如

some_command | while read c1 c2; do echo $c2; done

或者:

while read c1 c2; do echo $c2; done < in.txt
于 2016-04-10T02:27:40.663 回答
13

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

$ awk '{print $1}' FPAT='"[^"]+"' file
"A B"
"C"
"D"
于 2013-04-22T08:47:21.377 回答
1
awk -F"|" '{gsub(/\"/,"|");print "\""$2"\""}' your_file
于 2013-04-22T08:53:48.380 回答
-1
#!/usr/bin/python
import sys 

col = int(sys.argv[1]) - 1

for line in sys.stdin:
    columns = line.split()

    try:
        print(columns[col])
    except IndexError:
        # ignore
        pass

然后,假设您将脚本命名为 co,例如,执行类似这样的操作来获取文件的大小(该示例假设您使用的是 Linux,但脚本本身是独立于操作系统的):-

ls -lh | co 5

于 2019-05-07T09:02:35.037 回答