Bash 将标准输出重定向到awk中的文件

Bash 将标准输出重定向到awk中的文件,bash,awk,gawk,Bash,Awk,Gawk,我正在尝试编写一个awk命令,从一个文件中提取某些字段,并将它们写入一个新文件。我能够分离字段(逗号圈定)并将其打印到标准输出,但我不知道如何以正确的格式将其放入新文件中。这是我当前的命令: $ awk '{FS =","};{print $3}' test.log > test1.log 这将在新文件中放置每行的第三个字段,但在新文件的开头插入两个空行,然后在每个字段之间插入一个空行。我还想保留逗号分隔符,但无法解决这个问题。我是bash和awk的新手,因此非常感谢您的帮助 下面是我的

我正在尝试编写一个awk命令,从一个文件中提取某些字段,并将它们写入一个新文件。我能够分离字段(逗号圈定)并将其打印到标准输出,但我不知道如何以正确的格式将其放入新文件中。这是我当前的命令:

$ awk '{FS =","};{print $3}' test.log > test1.log
这将在新文件中放置每行的第三个字段,但在新文件的开头插入两个空行,然后在每个字段之间插入一个空行。我还想保留逗号分隔符,但无法解决这个问题。我是bash和awk的新手,因此非常感谢您的帮助

下面是我的示例数据块:

10.60.3.109, anonymous, 12/1/2003, 6:56:20, MSFTPSVC1, CSS, ipaddr, 0, 0, 0, 331, 0, [3007]USER, anonymous, -,
10.60.3.109, -, 12/1/2003, 6:56:20, MSFTPSVC1, CSS, ipaddr, 0, 0, 0, 530, 1326, [3007]PASS, IEUser@, -,
10.60.3.109, anonymous, 12/1/2003, 6:56:20, MSFTPSVC1, CSS, ipaddr, 0, 0, 0, 331, 0, [3008]USER, anonymous, -,
10.60.3.109, -, 12/1/2003, 6:56:20, MSFTPSVC1, CSS, ipaddr, 0, 0, 0, 530, 1326, [3008]PASS, IEUser@, -,
10.60.3.109, anonymous, 12/1/2003, 6:56:20, MSFTPSVC1, CSS, ipaddr, 0, 0, 0, 331, 0, [3009]USER, anonymous, -,
10.60.3.109, -, 12/1/2003, 6:56:20, MSFTPSVC1, CSS, ipaddr, 0, 0, 0, 530, 1326, [3009]PASS, IEUser@, -,
10.60.3.109, sally, 12/1/2003, 6:56:26, MSFTPSVC1, CSS, ipaddr, 0, 0, 0, 331, 0, [3010]USER, sally, -,
10.60.3.109, -, 12/1/2003, 6:56:26, MSFTPSVC1, CSS, ipaddr, 16, 0, 0, 530, 1326, [3010]PASS, -, -,
10.60.3.109, sally, 12/1/2003, 6:56:31, MSFTPSVC1, CSS, ipaddr, 0, 0, 0, 331, 0, [3011]USER, sally, -,
10.60.3.109, -, 12/1/2003, 6:56:31, MSFTPSVC1, CSS, ipaddr, 31, 0, 0, 530, 1326, [3011]PASS, -, -,
10.60.3.109, sally, 12/1/2003, 6:56:36, MSFTPSVC1, CSS, ipaddr, 0, 0, 0, 331, 0, [3012]USER, sally, -,
10.60.3.109, -, 12/1/2003, 6:56:36, MSFTPSVC1, CSS, ipaddr, 15, 0, 0, 530, 1326, [3012]PASS, -, -,
10.60.3.109, sally, 12/1/2003, 6:56:40, MSFTPSVC1, CSS, ipaddr, 0, 0, 0, 331, 0, [3013]USER, sally, -,
10.60.3.109, sally, 12/1/2003, 6:56:40, MSFTPSVC1, CSS, ipaddr, 0, 0, 0, 230, 0, [3013]PASS, -, -,
10.60.3.109, sally, 12/1/2003, 6:56:40, MSFTPSVC1, CSS, ipaddr, 0, 0, 0, 331, 0, [3014]USER, sally, -,
10.60.3.109, sally, 12/1/2003, 6:56:40, MSFTPSVC1, CSS, ipaddr, 0, 0, 0, 230, 0, [3014]PASS, -, -,
10.60.3.109, sally, 12/1/2003, 6:56:47, MSFTPSVC1, CSS, ipaddr, 0, 0, 0, 331, 0, [3015]USER, sally, -,
第一个操作是
{FS=“,”}
,它正在为每一行执行。它的前面可能应该加上
BEGIN
。因为字段分隔符当前未设置,直到第一行已被读取和拆分后,第一行最有可能作为单个字段读取,因此<代码> $ 3 < /COD>为空,导致空白行。 第二个动作是
,它会打印整行,但似乎没有任何作用。你通常不会用那样的分号;它通常只出现在动作的括号内

第三个操作是
{print$3}
,它打印第三个字段(当有第三个字段要打印时)

我还不确定我是否理解输出开头的双空行,除非输入开头有一个空行。我也没有使用Mac OS X 10.10.1 Yosemite的BSD
awk
,但也使用GNU
awk
3.1.7再现交替的空行

您可能想要:

awk 'BEGIN {FS = ","} {print $3}' test.log > test1.log
或者(在我看来更可取):

其中逗号周围的引号是可选的(因为逗号不是shell元字符)。但如果以后要选择多个字段,则可能需要按照a中的建议执行,并使用:

awk 'BEGIN {OFS = FS = ","} {print $3, $5, $9}' test.log > test1.log

对于要打印的字段的任何排列。

如果只获取一列,
,分隔符的用途是什么?你能发布一些示例输入数据和预期输出吗?最后我会复制几个字段。在原始文件中,每个字段用逗号分隔,没有空格。
awk'BEGIN{FS=OFS=“,”}{print$1,$2,$4}test.log>test1.log
将允许您在决定提取多个列时保留
分隔符。@Rostro:您的数据是否来自DOS(Windows)并且有CRLF行结尾?或者您的数据是否有交替的数据行和空行?在这里抓救命稻草。快速试验DOS格式的文件并没有显示出问题。@Rostro:就像我说的,我正在抓救命稻草。正如我在更新我的评论时所指出的,CRLF似乎对我没有任何影响。(我的测试数据文件有行
a,b,c,d
然后
1,2,3,4
然后
a,b,c,d
,有Unix或DOS行结尾。)我可以在开头解释一个空行;我无法解释交替字段3行和空白行。你能显示样本数据的前10行吗?好的。您是在类Unix系统上还是在Windows系统上?您使用的是哪个版本的
awk
?我仍然怀疑分号是空白行的原因。如果你在脚本中省略分号,它们会出现吗?很有趣。在我的Ubuntu 14.04上,
awk
是指向
/etc/alternations/awk
的链接,它又链接到
/usr/bin/mawk
,后者拒绝识别版本。问题中显示的数据中有大量空格,因此当我尝试脚本时,它会打印一个$3的值(对于显示的片段为
12/1/2003,
)作为第一行。我甚至不能确定我是否能解释您的空行输出-除非您没有显示真正的日志文件。当我在Ubuntu14.04 LTS上安装了
gawk
时,我得到了
gawk
4.0.1。
awk -F"," '{print $3}' test.log > test1.log
awk 'BEGIN {OFS = FS = ","} {print $3, $5, $9}' test.log > test1.log