【问题标题】:How to print all lines that matches a particular string?如何打印与特定字符串匹配的所有行?
【发布时间】:2020-09-03 15:18:24
【问题描述】:

我打算打印所有行及其行号及其在与特定字符串匹配的特定目录中的位置

示例..

/home/some_dir/file.txt -(LineNo) -(printing_thatlineitself)

我目前有 2 个命令,但都有一些缺点

find /home/some_dir -type f -exec grep -Hn "Text To Find" {} \;

上面的这个 find 命令似乎可以正常工作,但问题是它工作很慢

find /home/some_dir -type f -print0 | xargs -0 grep -Hn -C2 "Text To Find"

此命令的运行速度相对较快,但它提供的结果不准确。它甚至打印我输入的字符串根本不存在的那些行

谁能提供一个既准确又快速的解决方案? PS / 如果解决方案不使用 find 命令来实现这一点,那很好。它必须是我可以直接在 CLI 中运行的东西

【问题讨论】:

  • -C2 出现在第二个命令中,但不是第一个...要使第一个命令运行得更快,请使用 {} +... 如果您的内容是 ASCII,请使用 LC_ALL=C grep 以获得更快结果..另一个建议是使用ripgrep而不是find+grep
  • grep 可以自行递归搜索,试试grep -IHnr "my regex" /home/some_dir/。如果您想找到一个简单的文本,您也可以使用-F,这表明您正在寻找固定字符串而不是正则表达式。
  • grep -IHnr "Text to find" . 是完成这项工作的强大而快速的方法。-
  • xargs 解决方案更快可能不是真的,尽管在某些情况下它可能会更早开始打印结果。

标签: linux awk printing grep find


【解决方案1】:

正如 cmets 中所建议的,可以使用 grep 非常有效地完成此操作

grep -IHnr "Text to find" .

-I : Process a binary file as if it did not contain matching data (to exclude binary files)

-H : Print the filename for each match

-n : Display the matched lines and their line numbers

-r : Recursively search subdirectories listed

"Text to find" : Search string

. : Directory for search (current directory)

【讨论】:

    【解决方案2】:

    我不会将所有内容都压缩到一个命令中。编写一个结合了多个实用程序的小型 shell 脚本会更简单。例如,

    $ cat script.sh
    #!/bin/sh   
    IFS='
    '
    for i in `find . -type f`
    do
        awk '
        /Text To Find/ {
            print FILENAME, NR
        }' "$i"
    done
    $ chmod +x script.sh
    $ ./script.sh 
    ./script.sh 7
    

    【讨论】:

    猜你喜欢
    • 2011-02-26
    • 2012-11-21
    • 1970-01-01
    • 1970-01-01
    • 2019-04-28
    • 1970-01-01
    • 1970-01-01
    • 2017-12-19
    相关资源
    最近更新 更多