【问题标题】:Linux grep command with complex delimiter带有复杂分隔符的 Linux grep 命令
【发布时间】:2014-02-21 11:57:54
【问题描述】:

我在一个目录中有一些文件:

140221_alzproddbadm01.log
140221_alzproddbadm02.log
140221_alzproddbadm03.log
132123_ehxsk01.log
try.sh
logs
expan
140221_alzproddbadm04.log
23891_ehxsk02.log

我只需要 grep 这些:

140221_alzproddbadm04.log
23891_ehxsk02.log
140221_alzproddbadm01.log
140221_alzproddbadm02.log
140221_alzproddbadm03.log
132123_ehxsk01.log

格式并不复杂(numbers + _ + bla bla bla)但我不知道如何为我的问题编写正确的正则表达式。

ls -l | grep root | cut -d " " -f9 | grep #what to write next?

【问题讨论】:

  • 您可以将 *.log 传递给 ls 然后通过管道传输它。
  • 下次可能还有其他日志文件。

标签: regex linux bash shell grep


【解决方案1】:

你可以这样做:

$ grep -E '[0-9]*_[[:alpha:]]*.log' file
140221_alzproddbadm01.log
140221_alzproddbadm02.log
140221_alzproddbadm03.log
132123_ehxsk01.log
140221_alzproddbadm04.log
23891_ehxsk02.log

甚至

ls -l [0-9]*_[a-z]*.log | grep root | ...

【讨论】:

  • 顶行的“文件”字是什么?
  • 我将您的文件列表保存在一个文件file 中,以便我可以在那里grep
  • 谢谢。从另一个文件夹中抓取它们怎么样?当我显示他们的特定文件夹时,例如“ls -l /tmp/network [0-9]....”,它会显示所有文件两次。我该如何解决?
  • 然后,您可以使用ls -l /tmp/network/[0-9]*_[a-z]*.log 注意network[0-9] 之间没有空格。
  • shell模式与正则表达式略有不同;它将匹配以数字开头、包含下划线并在.log 之前至少包含一个小写字母的任何文件名。
【解决方案2】:

只需使用find 命令:

find /path/to/dir -name "*\.log"

【讨论】:

    【解决方案3】:

    为什么不适当地对文件进行通配符?例如

    $ grep pattern *.log
    

    所以外壳本身将简单地将任何以'.log'结尾的内容传递给grep。请注意,这与 grep 无关,而是与 shell globbing function 相关,因此适用于任何命令。

    如果您有特定的文件列表 (/tmp/listOfFiles.txt),那么可能:

        #!/bin/bash
        while IFS= read -r file
        do
               grep pattern "$file"
        done < /tmp/listOfFiles.txt
    

    请参阅here 了解更多信息。

    【讨论】:

    • 我没有提到它,但可能还有其他我不想 grep 的日志文件。
    • 那真是完全不同的场景
    猜你喜欢
    • 2012-02-29
    • 1970-01-01
    • 2015-11-05
    • 2016-06-15
    • 2021-08-30
    • 1970-01-01
    • 2022-09-23
    • 2013-11-21
    • 1970-01-01
    相关资源
    最近更新 更多