Linux 如何使用sed或awk从文件中提取字段

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 我想从每一行中删除“**服务器找

我从文件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
我想从每一行中删除“**服务器找不到”和“: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