我的命令输出类似于:
1540 "A B"
6 "C"
119 "D"
第一列始终是数字,后跟空格,然后是双引号字符串。
我的目的是只获取第二列,例如:
"A B"
"C"
"D"
我打算使用<some_command> | awk '{print $2}'
来完成此任务。但问题是,第二列中的某些值包含空格,这恰好是awk
分隔字段的默认分隔符。因此,输出搞砸了:
"A
"C"
"D"
如何干净地获得第二列的值(带成对引号)?
答案 0 :(得分:160)
使用-F [field separator]
分割"
s上的行:
awk -F '"' '{print $2}' your_input_file
或来自管道的输入
<some_command> | awk -F '"' '{print $2}'
输出:
A B
C
D
答案 1 :(得分:72)
如果您可以使用“awk”以外的其他内容,请尝试使用
echo '1540 "A B"' | cut -d' ' -f2-
-d 是一个分隔符, -f 是要剪切的字段,而 -f2 - 我们打算将第二个字段切割为端。
答案 2 :(得分:28)
或使用sed&amp;正则表达式。
<some_command> | sed 's/^.* \(".*"$\)/\1/'
答案 3 :(得分:28)
这应该可以从命令输出中获取特定的列&#34; docker images&#34;:
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
这将打印第三栏
答案 4 :(得分:15)
你不需要awk。在Bash shell中使用read
就足够了,例如
some_command | while read c1 c2; do echo $c2; done
或:
while read c1 c2; do echo $c2; done < in.txt
答案 5 :(得分:10)
如果您有GNU awk,这就是您想要的解决方案:
$ awk '{print $1}' FPAT='"[^"]+"' file
"A B"
"C"
"D"
答案 6 :(得分:0)
awk -F"|" '{gsub(/\"/,"|");print "\""$2"\""}' your_file
答案 7 :(得分: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