我想以递归的方式找到一些特定的文字,我已经阅读了这个非常流行的答案:
grep -rnw '/path/to/somewhere/' -e 'pattern'
但它对我不起作用,因为我的文件很大,可能需要很长时间才能找到整个文件,因此我只想搜索最后N行,以提高性能和所需的时间做一下这个动作,例如:
答案 0 :(得分:0)
此代码将打印所有文件,之后将打印每个文件名匹配的字符串。您可以使用参数来完全按照自己的意愿制作。例如,如果您将-print移动到最后,那么只会打印匹配的文件(但在匹配的字符串之后)
find /path/to/somewhere/ -type f -print -exec bash -c "cat -n {} | tail | grep -we pattern" \;
答案 1 :(得分:0)
我会使用GNU's parallel
,bash
和tail
:
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