将stdout重定向到awk中的文件

时间:2015-01-25 05:35:13

标签: bash awk gawk

我正在尝试编写一个awk命令,从某个文件中取出某些字段并将其写入新文件。我能够将字段(逗号描述)分开并将其打印到标准输出,但我无法弄清楚如何以正确的格式将其放入新文件中。这是我目前的命令:

$ awk '{FS =","};{print $3}' test.log > test1.log

这会将每行的第三个字段放在新文件中,但在新文件的开头插入2个空行,然后在每个字段之间插入一个空行。我也想保留逗号分隔符,但不能算出以太。我是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, -,

1 个答案:

答案 0 :(得分:2)

awk '{FS =","};{print $3}' test.log > test1.log

第一个操作是{FS = ","},它正在为每一行执行。它应该在BEGIN之前。由于字段分隔符当前未在第一行已被读取和拆分之后设置,因此第一行很可能被读取为单个字段,因此$3为空,从而导致空行。

第二个动作是;,其中打印整行似乎没有做任何事情。你通常不会使用这样的分号;它通常只出现在动作的大括号内。

第三个动作是{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

或(在我看来最好):

awk -F"," '{print $3}' test.log > test1.log

其中逗号周围的引号是可选的(因为逗号不是shell元字符)。但是,如果您以后要选择多个字段,则可能希望按jaypal singh中建议的comment进行操作,并使用:

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

用于您想要打印的字段的任何排列。