递归查找最后n行的特定文本

时间:2017-06-05 20:43:12

标签: linux shell unix

我想以递归的方式找到一些特定的文字,我已经阅读了这个非常流行的答案:

grep -rnw '/path/to/somewhere/' -e 'pattern'

但它对我不起作用,因为我的文件很大,可能需要很长时间才能找到整个文件,因此我只想搜索最后N行,以提高性能和所需的时间做一下这个动作,例如:

3 个答案:

答案 0 :(得分:0)

此代码将打印所有文件,之后将打印每个文件名匹配的字符串。您可以使用参数来完全按照自己的意愿制作。例如,如果您将-print移动到最后,那么只会打印匹配的文件(但在匹配的字符串之后)

find /path/to/somewhere/ -type f -print -exec bash -c "cat -n {} | tail | grep -we pattern" \;

答案 1 :(得分:0)

我会使用GNU's parallelbashtail

my_tail_grep() {
    file="$1"
    pattern="$2" 
    N="${3:-100}"  # Optional -- defaults to 100
    res=$(tail -n "$N" "$file" | grep -we "$pattern")
    [[ -n "$res" ]] && echo -e "${file}\n${res}" || :
}

export -f my_tail_grep # Necessary for parallel 

find /path -type f | parallel my_tail_grep {} "$pattern" 100 

答案 2 :(得分:0)

使用find命令通过n参数指定最后N行

n=11
find /path/to/somewhere/ -type f -exec sh -c 'tail -n '$n' {} | grep -wn pattern' \; -print