Bash 如何从管道分隔文件打印字段?
我有一个文件,其中的字段由管道字符分隔,我只想打印第二个字段。此尝试失败:Bash 如何从管道分隔文件打印字段?,bash,unix,shell,awk,ksh,Bash,Unix,Shell,Awk,Ksh,我有一个文件,其中的字段由管道字符分隔,我只想打印第二个字段。此尝试失败: $ cat file | awk -F| '{print $2}' awk: syntax error near line 1 awk: bailing out near line 1 bash: {print $2}: command not found 有没有办法做到这一点?管道字符需要转义,以便shell不会解释它。一个简单的解决方案: $ awk -F\| '{print $2}' file 另一种选择是引用
$ cat file | awk -F| '{print $2}'
awk: syntax error near line 1
awk: bailing out near line 1
bash: {print $2}: command not found
有没有办法做到这一点?管道字符需要转义,以便shell不会解释它。一个简单的解决方案:
$ awk -F\| '{print $2}' file
另一种选择是引用字符:
$ awk -F'|' '{print $2}' file
或者只使用一个命令:
cut -d '|' -f FIELDNUMBER
“文件”不包含管道符号,因此不打印任何内容。您应该使用“cat file”,或者只是在awk程序之后列出文件。这里的关键点是管道字符(
|
)必须转义到shell中。使用“\\\\\
”或“”
”保护它不受shell解释的影响,并允许它在命令行上传递给awk
阅读评论后,我发现原始海报呈现了原始问题的简化版本,其中涉及在选择和打印字段之前过滤
文件。使用直通式grep
,结果通过管道传输到awk进行字段选择。这就解释了问题中出现的完全不必要的cat文件
(它取代了grep文件
)
好的,那就行了。然而,awk本身基本上是一个模式匹配工具,可以信任它可以在不需要调用grep
的情况下查找和处理匹配行。使用类似于:
awk -F\| '/<pattern>/{print $2;}{next;}' file
awk-F\|'/{print$2;}{next;}文件
/
位告诉awk
在匹配
的行上执行后续操作
lost look{next;}
是一个默认操作,会跳到输入中的下一行。这似乎没有必要,但我很久以前就有这个习惯了 使用awk的另一种方法
awk 'BEGIN { FS = "|" } ; { print $2 }'
伯格。很抱歉。原始代码grep'ed一个文件,然后通过管道将输出传输到awk。我对命令进行了消毒,但没有对其进行测试:(请注意,问题的关键是管道字符,而不是使用的命令。但这是一个很好的解决方案。我考虑过,但我更希望有一个解释问题的答案。事实上,这就是我评论的重点。;-)应该是cut-d'|'-f FIELDNUMBER FILENAME