Я пытаюсь найти все файлы, содержащие точно такой же идентификатор, как указано в другом файле, и поместить имена файлов в другой файл. Я использую команду ниже, чтобы найти файлы.
grep -w -f SearchList.txt INFILES* > matched.txt
Идентификаторы перечислены в файле SearchList.txt. пример -
450462134
747837483
352362362
Файлы INFILES содержат данные в этом формате -
0120171116 07:37:45:828501450462134 000001205 0120171116
07:37:45:828501747837483 000001205 0120171116
07:37:45:828501352362362 000001205
Идентификаторы, которые я ищу, объединены с другим текстом в начале, но в конце есть пробел.
Я попытался поместить \ b в начало и конец текста поиска в файле SearchList.txt, но все равно получаю неверные результаты.
Будем очень признательны за любые выводы к правильной команде.
-bash-3.2$ bash --version
GNU bash, version 3.2.25(1)-release (x86_64-redhat-linux-gnu)
-bash-3.2$ grep --version
grep (GNU grep) 2.5.1
Если в вашем SearhList.txt есть записи типа 120171116
, 00001205
или 2134
, должны ли они совпадать с первой строкой или у вас есть дополнительные требования?
Параметр -w
для grep
фактически вставляет \b
на обоих концах паттерна, вы хотите, чтобы он был только в конце. Один из подходящих вариантов - добавить \b
к паттернам с sed
, например:
sed 's/$/\\b/' SearchList.txt
Поскольку вас интересует только совпадение имен файлов, вам следует использовать опцию -l
с grep
. Теперь используйте это вместе с grep
и обработайте замену:
grep -lf <(sed 's/$/\\b/' /path/to/SearchList.txt) INFILES*
Спасибо за объяснение. Это очень полезно.