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