bash脚本编写-使用sed或awk拆分和提取数据

时间:2019-01-29 19:06:42

标签: regex awk sed dns

我在遇到特定情况时遇到麻烦。如果我的文件中充满以下条目:

my.site.example.com
somelinewithnodot
some.line .with.a.weird.space..this.is
this.one.has , and.stuff*.all.I
&&&83%23^&4,I;dont,even.need.2see

使用bash,我如何使用awk或sed之类的东西,或以“。”分隔每一行上的数据。然后仅在最后“。”之前和之后直接打印条目,而忽略不带“。”的行。

所需的输出:

example.com
somelinewithnodot
this.is
all.I
need.2see

我一直在尝试使用sed,但是在设置正则表达式时遇到了麻烦。我之前已经做过这样的事情,但是已经一分钟了,我在记住如何正确设置它上遇到麻烦...

4 个答案:

答案 0 :(得分:4)

请您尝试以下。

awk -F'.' 'NF>1{print $(NF-1) FS $NF;next} 1'  Input_file
OR
awk 'BEGIN{FS=OFS="."}NF>1{print $(NF-1) FS $NF;next} 1' Input_file

OR

awk -F'.' 'NF>1{$0=$(NF-1) FS $NF} 1'  Input_file
OR
awk 'BEGIN{FS=OFS="."}NF>1{print $(NF-1) FS $NF;next} 1' Input_file

答案 1 :(得分:2)

您可以使用sed代替:

sed 's/^\([^.]*\.\)*\([^.]\+\.[^.]\+\)$/\2/'

答案 2 :(得分:1)

这可能对您有用(GNU sed):

sed -E 's/.*[.](.*[.].*)$/\1/' file

匹配最后两个.,并用最后一个.和两边的单词替换。

替代:

sed 's/.*\.\(.*\..*\)$/\1/' file

答案 3 :(得分:1)

您也可以尝试Perl

perl -ne ' /(^[^\.]+$)|(?<=\.)([^\.]+\.[^\.]+$)/g and print "$1$2" '

带有输入

$ cat johnred.txt
my.site.example.com
somelinewithnodot
some.line .with.a.weird.space..this.is
this.one.has , and.stuff*.all.I
&&&83%23^&4,I;dont,even.need.2see

$ perl -ne ' /(^[^\.]+$)|(?<=\.)([^\.]+\.[^\.]+$)/g and print "$1$2" ' johnred.txt
example.com
somelinewithnodot
this.is
all.I
need.2see

$

.在[]中使用时失去其特殊含义,因此您可以使用

perl -ne ' /(^[^.]+$)|(?<=\.)([^.]+\.[^.]+$)/g and print "$1$2" ' johnred.txt

使用数组操作的另一种解决方案

perl -lne ' @b=$_=~/([^.]+)/g ; print $b[-2]? "$b[-2].":"", $b[-1] ' johnred.txt