Linux 如何使用sed或awk从文件中提取字段
我从文件1中的以下列表开始Linux 如何使用sed或awk从文件中提取字段,linux,bash,Linux,Bash,我从文件1中的以下列表开始 ** server can't find bla.bla.com: NXDOMAIN ** server can't find bla2.bla.com: NXDOMAIN ** server can't find bla3.bla.com: NXDOMAIN ** server can't find bla4.bla.com: NXDOMAIN ** server can't find bla5.bla.com: NXDOMAIN 我想从每一行中删除“**服务器找
** server can't find bla.bla.com: NXDOMAIN
** server can't find bla2.bla.com: NXDOMAIN
** server can't find bla3.bla.com: NXDOMAIN
** server can't find bla4.bla.com: NXDOMAIN
** server can't find bla5.bla.com: NXDOMAIN
我想从每一行中删除“**服务器找不到”和“:NXDOMAIN”,并将结果放入一个新文件中
结果应该是-
bla.bla.com
bla2.bla.com
bla3.bla.com
bla4.bla.com
bla5.bla.com
我已经尝试了下面的sed命令,但是我一直得到一个>提示
sed '/\*\* server can't find /d' file1
有什么想法或更好的方法来实现这一点
sed '/\*\* server can't find /d' file1
正在删除整行
sed "s/\*\* server can't find //" file1
将用空字符串替换字符串。两个问题:
\'
或''''
。另一个选项是切换到双引号,但当字符串包含双引号中具有特殊含义的字符时(例如,$
),您必须小心d
删除整行,而不仅仅是匹配的部分。用替换代替单引号是问题所在。尝试:
sed "s/\*\* server can't find \(.*\): NXDOMAIN/\1/" file1
它使用一个捕获组来抓取您想要保留的线路部分。使用GNU的
grep
您可以使用正向前瞻(?=
):
或者使用perl
:
perl -nle 'print $& if m{\S+(?=:)}' inputfile
使用awk:
cat 1.txt | awk '{print substr($5,0,index($5,":")-1)}'
bla.bla.com
bla2.bla.com
bla3.bla.com
bla4.bla.com
bla5.bla.com
perl -nle 'print $& if m{\S+(?=:)}' inputfile
cat 1.txt | awk '{print substr($5,0,index($5,":")-1)}'
bla.bla.com
bla2.bla.com
bla3.bla.com
bla4.bla.com
bla5.bla.com