将 stdout 重定向到 awk 中的文件

Redirecting stdout to a file in awk

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

$ awk '{FS =","};{print }' 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, -,
awk '{FS =","};{print }' test.log > test1.log

第一个动作是{FS = ","},每一行都在执行。它前面可能应该有 BEGIN。因为字段分隔符目前直到第一行被读取和拆分后才设置,第一行很可能被读取为单个字段,因此 </code> 为空,导致空白行。</p> <p>第二个动作是<code>;打印整行似乎什么也没做。您通常不会那样使用分号;它通常只出现在动作的大括号内。

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

我不确定我是否理解你输出开头的双空行,除非你输入的开头有一个空行。我也没有复制交替的空白行,这是使用来自 Mac OS X 10.10.1 Yosemite 的 BSD awk,但也使用 GNU awk 3.1。 7.

你可能想要:

awk 'BEGIN {FS = ","} {print }' test.log > test1.log

或(我认为更可取):

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

逗号周围的引号是可选的(因为逗号不是 shell 元字符)。但是,如果您稍后要选择多个字段,您可能希望按照 jaypal singh suggested in a 的方式进行操作,并使用:

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

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