Я сделал следующее:
for i in ~/files/*; do cat $i | grep -e word1 -e word2; done
Выход был: все значения, содержащие word1 и рядом с ним, - все файлы, содержащие word2. Не только они содержат оба. И мне нужны имена файлов, а не только значения.
Здесь будут найдены строки, содержащие word1 или word2:
for i in ~/files/*; do
echo "Matches in file $i:"
grep -E "word1|word2" "$i"
done
Если вы хотите найти строки со словом1 или word2, вместо этого выполните:
for i in ~/files/*; do
echo "Matches in file $i:"
grep word1 "$i" | grep word2
done
В общем случае вы можете использовать опцию grep -H для «[p] rint имя файла для каждого совпадения».
Это найдет строки, которые содержат word1 или word2:
grep -HE "word1|word2" ~/files/* 2>/dev/null
Если вы хотите найти строки с word1 или word2, вместо этого выполните:
grep -HE "word1.*word2|word2.*word1" ~/files/* 2>/dev/null
Отправка stderr в темное забвение с помощью 2>/dev/null предотвращает вывод f10 из бесполезных сообщений об ошибках, например если один из файлов сопоставления - это каталог.
В общем случае вы можете использовать опцию grep -H для «[p] rint имя файла для каждого совпадения».
Это найдет строки, которые содержат word1 или word2:
grep -HE "word1|word2" ~/files/* 2>/dev/null
Если вы хотите найти строки с word1 или word2, вместо этого выполните:
grep -HE "word1.*word2|word2.*word1" ~/files/* 2>/dev/null
Отправка stderr в темное забвение с помощью 2>/dev/null предотвращает вывод f10 из бесполезных сообщений об ошибках, например если один из файлов сопоставления - это каталог.
grep обычно печатает строки, соответствующие любому из предоставленных шаблонов. Чтобы напечатать строки, соответствующие нескольким шаблонам, выведите вывод одного grep в другой:
grep word1 | grep word2
Для многих файлов:
grep word1 ~/files/* | grep word2
Нет необходимости в цикле или cat.
Возможно, это неверно работает для файлов, имена которых содержат word2. В этом случае объедините шаблоны вручную в один grep:
grep -e 'word1.*word2' -e 'word2.*word1' ~/files/*
Если для grep предоставлено несколько файлов, оно печатает имя файла по умолчанию. Чтобы заставить это для одного имени файла, используйте -H:
-H, --with-filename
Print the file name for each match. This is the default when
there is more than one file to search.
Если вы получаете сообщение об слишком длинном списке аргументов, и каталог не содержит подкаталогов, я бы все же сказал [ f11] для рекурсии:
grep -R -e 'word1.*word2' -e 'word2.*word1' ~/files
grep обычно печатает строки, соответствующие любому из предоставленных шаблонов. Чтобы напечатать строки, соответствующие нескольким шаблонам, выведите вывод одного grep в другой:
grep word1 | grep word2
Для многих файлов:
grep word1 ~/files/* | grep word2
Нет необходимости в цикле или cat.
Возможно, это неверно работает для файлов, имена которых содержат word2. В этом случае объедините шаблоны вручную в один grep:
grep -e 'word1.*word2' -e 'word2.*word1' ~/files/*
Если для grep предоставлено несколько файлов, оно печатает имя файла по умолчанию. Чтобы заставить это для одного имени файла, используйте -H:
-H, --with-filename
Print the file name for each match. This is the default when
there is more than one file to search.
Если вы получаете сообщение об слишком длинном списке аргументов, и каталог не содержит подкаталогов, я бы все же сказал grep для рекурсии:
grep -R -e 'word1.*word2' -e 'word2.*word1' ~/files
grep обычно печатает строки, соответствующие любому из предоставленных шаблонов. Чтобы напечатать строки, соответствующие нескольким шаблонам, выведите вывод одного grep в другой:
grep word1 | grep word2
Для многих файлов:
grep word1 ~/files/* | grep word2
Нет необходимости в цикле или cat.
Возможно, это неверно работает для файлов, имена которых содержат word2. В этом случае объедините шаблоны вручную в один grep:
grep -e 'word1.*word2' -e 'word2.*word1' ~/files/*
Если для grep предоставлено несколько файлов, оно печатает имя файла по умолчанию. Чтобы заставить это для одного имени файла, используйте -H:
-H, --with-filename
Print the file name for each match. This is the default when
there is more than one file to search.
Если вы получаете сообщение об слишком длинном списке аргументов, и каталог не содержит подкаталогов, я бы все же сказал grep для рекурсии:
grep -R -e 'word1.*word2' -e 'word2.*word1' ~/files