我需要找到特定字符串出现两次或更多的文件。
例如,有三个文件:
文件1:
Hello World!
文件2:
Hello World!
Hello !
文件3:
Hello World!
Hello
Hello Again.
我想使用grep命令来搜索“Hello”,并只获取文件2和3。
我需要找到特定字符串出现两次或更多的文件。
例如,有三个文件:
文件1:
Hello World!
文件2:
Hello World!
Hello !
文件3:
Hello World!
Hello
Hello Again.
我想使用grep命令来搜索“Hello”,并只获取文件2和3。
grep -o -c Hello * | awk -F: '{if ($2 > 1){print $1}}'
($2 > 1)
,否则它只会打印具有 3
或更多命中的文件。 - Jotne由于此问题标记为grep
,因此这里提供仅使用该实用程序和bash
的解决方案(无需awk
):
#!/bin/bash
for file in *
do
if [ "$(grep -c "Hello" "${file}")" -gt 1 ]
then
echo "${file}"
fi
done
可以写成单行代码:
for file in *; do if [ "$(grep -c "Hello" "${file}")" -gt 1 ]; then echo "${file}"; fi; done
for file in *
语句以获取所有数据文件。grep -c
返回与模式匹配的行数,即使一行上有多个匹配项仍只计为一个匹配的行数。if [ ... -gt 1 ]
测试文件中是否匹配了一行以上。如果是:echo ${file}
打印文件名。这个 awk
命令会打印出所有含有两个或两个以上 Hello
的文件名。
awk 'FNR==1 {if (a>1) print f;a=0} /Hello/ {a++} {f=FILENAME} END {if (a>1) print f}' *
file2
file3
grep
工具,它可以跨越行结束符识别模式(例如“hello”后面跟着任何内容(可能包括换行符),再跟着“hello”)。grep
按行处理文件,因此单独使用并不适合这个任务 - 除非你将整个文件塞入一行中。tr
命令,将换行符替换为空格:if cat $file | tr '\n' ' ' | grep -q 'hello.*hello'
then
echo "$file matches"
fi
这种方法非常高效,即使在有很多行(比如100000行)的大文件中也是如此,可以通过使用--max-count=1
参数调用grep
使其在找到匹配项后停止搜索以进一步提高效率。无论两个"hello"是否在同一行上都不重要。
grep Hello * | cut -d: -f1 | uniq -d
uniq
命令的-d
开关!有趣! - F. Hauri - Give Up GitHubhello hello
。(查找出现两次或更多次特定字符串的文件。
)因此,我想出了这个一行代码:awk -v p="hello" 'FNR==1{x=0}{x+=gsub(p,p);if(x>1){print FILENAME;nextfile}}' *
p
是您想要搜索的模式一个小测试:
kent$ head f*
==> f <==
hello hello world
==> f2 <==
hello
==> f3 <==
hello
hello
SK-Arch 22:27:00 /tmp/test
kent$ awk -v p="hello" 'FNR==1{x=0}{x+=gsub(p,p);if(x>1){print FILENAME;nextfile}}' f*
f
f3
将数据传输到脚本语言可能有些过度,但通常比仅使用awk
更容易。
grep -rnc "Hello" . | ruby -ne 'file, count = $_.split(":"); puts "#{file}: #{count}" if count&.to_i >= 2'
所以针对您的输入,我们得到
$ grep -rnc "Hello" . | ruby -ne 'file, count = $_.split(":"); puts "#{file}: #{count}" if count&.to_i >= 2'
./2: 2
./3: 3
或者省略计数
grep -rnc "Hello" . | ruby -ne 'file, _ = $_.split(":"); puts file if count&.to_i >= 2'
grep -c Hello * | egrep -v ':[01]$' | sed 's/:[0-9]*$//'
请将其翻译为中文。