我有一个包含以下内容的文本文件:
Hostname=Hostname2,Hostname3
使用bash命令如何只将Hostname2
和Hostname3
提取到一个单独的文件中。我希望Hostname2
和Hostname3
处于不同的界限。有时文本文件将超过2个主机,Hostname=Hostname2,Hostname3,Hostname4
然后我将不得不将所有3个主机提取到单独的文件中。怎么能在bash中完成?
egrep -o '[^=,]+' /path/to/file | tail -n +2 > /path/to/new\ file
egrep
:一种文件模式搜索器,允许您使用正则表达式搜索文件内容和匹配行。
-o
:egrep
的一个选项,指示它只打印线的匹配部分,而不是整行。
'[^=,]+'
:用于匹配文件内容的正则表达式。在这里,[^=,]+
表示任何不是=
或,
连续出现至少一次的角色。简单地说,它匹配由=
或,
分隔的单词。
egrep
命令的结果是:
Hostname
Hostname2
Hostname3
Hostname4
|
:将上一个命令(egrep
)的结果输入下一个命令:
tail -n +2
:获取输入并从相对于开头(即第二行)的行+2
开始,并打印剩余的行。
将前一个命令的输出作为输入,tail
的结果是:
Hostname2
Hostname3
Hostname4
>
:最后,这会重定向上一个命令的输出并将其写入指定的文件。
您可以使用awk打印(仅)行的第二个“字段”,指示它使用=
作为带有-F
选项的“字段分隔符”。 awk
的输出是“Hostname2,Hostname3”。
然后可以使用tr
(“translate”)实用程序将所有逗号更改为换行符。结果打印到标准输出,以便您的shell可以通过>
将其重定向到文件。
awk -F= '{print $2}' file | tr ',' '\n' > hostnames.txt