文件在bash中解析

问题描述 投票:0回答:2

我有一个包含以下内容的文本文件:

Hostname=Hostname2,Hostname3

使用bash命令如何只将Hostname2Hostname3提取到一个单独的文件中。我希望Hostname2Hostname3处于不同的界限。有时文本文件将超过2个主机,Hostname=Hostname2,Hostname3,Hostname4然后我将不得不将所有3个主机提取到单独的文件中。怎么能在bash中完成?

bash shell cut
2个回答
0
投票
egrep -o '[^=,]+' /path/to/file | tail -n +2 > /path/to/new\ file

Explanation

egrep:一种文件模式搜索器,允许您使用正则表达式搜索文件内容和匹配行。

-oegrep的一个选项,指示它只打印线的匹配部分,而不是整行。

'[^=,]+':用于匹配文件内容的正则表达式。在这里,[^=,]+表示任何不是=,连续出现至少一次的角色。简单地说,它匹配由=,分隔的单词。

egrep命令的结果是:

Hostname
Hostname2
Hostname3
Hostname4

|:将上一个命令(egrep)的结果输入下一个命令:

tail -n +2:获取输入并从相对于开头(即第二行)的行+2开始,并打印剩余的行。

将前一个命令的输出作为输入,tail的结果是:

Hostname2
Hostname3
Hostname4

>:最后,这会重定向上一个命令的输出并将其写入指定的文件。


2
投票

您可以使用awk打印(仅)行的第二个“字段”,指示它使用=作为带有-F选项的“字段分隔符”。 awk的输出是“Hostname2,Hostname3”。

然后可以使用tr(“translate”)实用程序将所有逗号更改为换行符。结果打印到标准输出,以便您的shell可以通过>将其重定向到文件。

awk -F= '{print $2}' file | tr ',' '\n' > hostnames.txt
© www.soinside.com 2019 - 2024. All rights reserved.