【问题标题】:Is there a way to remove a line fully?有没有办法完全删除一条线?
【发布时间】:2020-10-21 11:47:56
【问题描述】:

我正在使用单行命令来编译和打印日志文件中列出的所有动物名称。

/wild 目录下的 WILD 名称均以大写字母列出。

输出应该以每行一个名称的格式出现,没有重复:

ANT
BAT
CAT

我试过了 grep 'wild' animal.txt | awk '{print $7}' | sed 's/[a-z0-9./]//g' | sort -u

它显示了我想要的,但我想删除包含特殊字符的整个字符串,如 -, # ? % 以下是文件animal.txt的示例

191.21.66.100 - - [21/Aug/1995:05:17:57 -0400] "GET /wild/elvpage.htm#ZOO HTTP/1.0"
191.21.66.100 - - [01/Aug/1995:02:22:35 -0400] "GET /wild/S/s_26s.jpg HTTP/1.0" 
191.21.66.100 - - [01/Aug/1995:02:22:41 -0400] "GET /wild/struct.gif HTTP/1.0" 
191.21.66.100 - - [01/Aug/1995:02:27:34 -0400] "GET /wild/elvpage.htm HTTP/1.0" 
191.21.66.100 - - [01/Aug/1995:02:27:36 -0400] "GET /wild/endball.gif HTTP/1.0" 
191.21.66.100 - - [01/Aug/1995:02:27:37 -0400] "GET /wild/hot.gif HTTP/1.0" 
191.21.66.100 - - [01/Aug/1995:02:27:38 -0400] "GET /wild/elvhead3.gif HTTP/1.0" 
191.21.66.100 - - [01/Aug/1995:02:27:38 -0400] "GET /wild/PEGASUS/minpeg1.gif HTTP/1.0" 
191.21.66.100 - - [01/Aug/1995:02:27:39 -0400] "GET /wild/DOG/DOG.gif HTTP/1.0"
191.21.66.100 - - [01/Aug/1995:02:27:39 -0400] "GET /wild/SWAN/SWAN.gif HTTP/1.0" 
191.21.66.100 - - [01/Aug/1995:02:27:39 -0400] "GET /wild/ATLAS/atlas.gif HTTP/1.0" 
191.21.66.100 - - [01/Aug/1995:02:27:40 -0400] "GET /wild/LIZARD/lizard.gif HTTP/1.0"

下面是我运行命令后的输出示例:

ATLAS
ATLAS-
CAT_
DOG
%FACT
-KWM
?TIL-
#ZOO

【问题讨论】:

    标签: linux sed grep


    【解决方案1】:

    为什么不只允许大写 A-Z 并删除其他所有内容:

    grep 'wild' animal.txt | awk '{print $7}' | sed 's/[^A-Z]//g'
    

    从您的示例输入中,这将返回:

    PEGASUS
    DOGDOG
    SWANSWAN
    ATLAS
    LIZARD
    

    如果需要:可以通过附加|sed "/^$/d" 进一步清理空行,然后进行排序

    【讨论】:

    • ...如果您不喜欢重复,请在末尾添加| sort | uniq :-)
    • 感谢 Ron 和 Dominique 的回复!你的代码比我的干净得多。我还在学习如何使用所有这些命令!
    • 很遗憾没有罗恩。我仍在研究如何删除整条线。在这种情况下,它从#ZOO 中删除了#,但我希望它完全删除。
    • 追加| grep -v "ZOO"或删除多个匹配行| egrep -v "ZOO|YARD|COFFEE"
    • Ron,我设法删除了所有其他我不想要的行。除了其中一个只有一个字母E。所以当我 ``` grep -v "E"``` 它将删除我所有其他包含该字母的行。哦,该死的,但你是一个了不起的人,罗恩感谢你帮助我!
    【解决方案2】:

    您可以使用单个 GNU sed 命令:

    sed -n 's!.*/wild/\([A-Z][A-Z]\+\)/.*!\1!p' animal.txt
    

    意思是:

    • -n:不要打印每一行。
    • s!X!Y! 将 X 替换为 Y。
    • .*/wild/\([A-Z][A-Z]\+\)/*:找到一个大写字母,后跟至少一个大写字母,前面是wild/。这些后面应该跟一个/ 和任何东西。捕捉(记住)大写字母。
    • !\1!:用大写字母序列替换你找到的任何内容。
    • p: 如果匹配,则打印该行。

    给予:

    PEGASUS
    DOG
    SWAN
    ATLAS
    LIZARD
    

    【讨论】:

    • 也许[A-Z]\{2,\} 可能比[A-Z][A-Z]\+ 提供更多信息,但[A-Z]\+ 不会?
    • 好点,我的意图是删除输入中的S,或者过滤掉任何不可能的单字母动物名称。
    【解决方案3】:

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

    sed -E '/.*\/wild\/[^A-Z ]*([A-Z]+).*/!d # delete lines with no uppercase letters
            s//\1/                           # remove everything but uppercases letters
            H                                # append word to the hold space
            $!d                              # delete all lines but the last
            x                                # swap to the hold space
            :a                               # loop name space
            s/((\n[^\n]+).*)\2/\1/           # remove duplicates
            ta                               # repeat until failure
            s/.//' file                      # remove introduced newline
    

    【讨论】:

      【解决方案4】:

      GNU awk 得到结果:

      grep 'wild' animal.txt | awk '
                                ($0 = $7)
                                {gsub(/\//, " ", $0)};        #replace '/' with space so we can separate $0 to ($1, $2, $3);
                                (NF == 3 && length($2) > 2)   #check if there is three word in line ($1, $2, $3) and then check if length($2) is more then 2 character
                                                 {print $2}'
      | sort -u
      

      答案:

      grep 'wild' animal.txt | awk '
                           ($0 = $7) {gsub(/\//, " ", $0)}; 
                           (NF == 3 && length($2) > 2) {print $2}' | sort -u
      

      【讨论】:

        猜你喜欢
        • 2021-04-11
        • 1970-01-01
        • 2011-10-13
        • 2015-11-27
        • 1970-01-01
        • 2010-10-29
        • 1970-01-01
        • 2012-12-05
        相关资源
        最近更新 更多