Насколько я понимаю, вы хотите перечислить файлы, содержащие оба "ключевое слово1" и "ключевое слово2".Для этого вы можете использовать два теста -exec
следующим образом:
find . -name "*.xml" -exec grep -iq keyword1 {} \; -exec grep -iH keyword2 {} \;
Это запустит второй grep
условно - если первый вернул истину. Параметр -q
предотвращает вывод из первого grep
, так как он перечислит все файлы, содержащие только «ключевое слово1».
Поскольку опция -H
выводит соответствующую строку вместе с именем файла, вы, вероятно, захотите использовать вместо этого -l
. Итак,
find . -name "*.xml" -exec grep -iq keyword1 {} \; -exec grep -il keyword2 {} \;
Это даст результат, аналогичный тому, что предложил Калеб, но без необходимости в дополнительном -print
.
Мы можем использовать awk с gsub, чтобы получить количество вхождений.
awk '{print $0","gsub(/foo/,"")}' file
Выход:
foo,bar,foo,foo,3
bar,foo,bar,bar,1
foo,foo,bar,bar,2
На случай, если кому-то тоже понадобится что-то на Python. Укажите имя файла и волшебное слово для подсчета.
#!/usr/bin/python3
# magic_word_count.py
# Takes a filename and magic word and prints the number of times the word
# appears on each line of the file.
#
#./magic_word_count.py myfile.txt foo
#
import sys
filename = sys.argv[1]
magic_word = sys.argv[2]
with open(filename, 'r') as f:
for line in f.readlines():
words = line.strip().split(',')
print(len([word for word in words if word == magic_word]))
Использование:
$ cat myfile.txt
foo,bar,foo,foo
bar,foo,bar,bar
foo,foo,bar,bar
$./magic_word_count.py myfile.txt foo
3
1
2
Возможно со смесью bash
иgrep
$ while read -r line; do
echo -n "$line -> "
grep -o foo <<<"$line" | wc -l
done < /path/to/my-input-file
foo,bar,foo,foo -> 3
bar,foo,bar,bar -> 1
foo,foo,bar,bar -> 2