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


152

我的命令输出如下:

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

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

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

"A B"
"C"
"D"

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

"A
"C"
"D"

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



1
我尝试使用awk '{$1=""; print $0}',但是它仍然具有领先的空白字符。可以将其删除sed '/^ //'。但是,可以这样做awk吗?
徐强

Answers:


29

或使用sed和regex。

<some_command> | sed 's/^.* \(".*"$\)/\1/'

cmd较短,因为您不需要开始和结束标记:<some_command> | sed 's/.* \(".*"\)/\1/'
Timo

197

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

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

或用于管道输入

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

输出:

A B
C
D

3
这很好,但我也想要原始的周围报价。能做到吗?谢谢。
徐强

5
您可以作弊,并将awk的打印内容更改为'{print "\""$2"\""}'
Alex

是的,这有效。非常感谢,Alex!顺便说一句,这么多引号,:)
Xug Xu

@Alex,您能解释一下如何使用双引号和反斜杠来获得操作员想要的东西。
Timo

1
@Timo可以将引号和反斜杠分解为"\"" + $2 + "\""。周围的引号表示要附加到输出的内容,并且转义的引号(\")正在打印。为了帮助可视化,这是我们想要在其周围添加空格$2而不是引号的样子'{print " "$2" "}'。我们还可以添加格式间距以使其更容易理解:'{print " " $2 " "}'
Tom

80

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

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

-d是定界符,-f是要剪切的字段,对于-f2-, 我们打算剪切第二个字段直到结束。


这有助于我尝试执行以下操作(在git中获取文件的提交ID):git注释myfile.cpp | grep'2016-07'| 头-1 | 切-f1
serup

2
这很好,但是如果定界符超过一个字符长,则不起作用。这就是awk解决方案派上用场的地方
smac89'9

2
为什么之后不使用空格-d?这样看起来有点奇怪。
克里斯·斯特里钦斯基

43

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

这将打印第三列


您是否看到了docker图片的问题?awk'{print $ 5}'吗?
Shashi Ranjan

17

您不需要这样做。read在Bash shell中使用就足够了,例如

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

要么:

while read c1 c2; do echo $c2; done < in.txt

13

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

$ awk '{print $1}' FPAT='"[^"]+"' file
"A B"
"C"
"D"

0
awk -F"|" '{gsub(/\"/,"|");print "\""$2"\""}' your_file

0
#!/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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.