Как искать строку в нескольких файлах? если не существует, отобразить имя файла - PullRequest
0 голосов
/ 17 октября 2019

У меня есть сценарий

, где я хочу найти ключевое слово в нескольких файлах

, если ключевое слово не существует, тогда отобразить имя файла

ключевое слово нужно искатьis '$$DEMO_STUDENT_NAME'

Команда не работает ...

grep "$$DEMO_STUDENT_NAME" /d/demo/

Ответы [ 5 ]

1 голос
/ 17 октября 2019

Предполагая, что $$DEMO_STUDENT_NAME является буквально искомым словом, а не неправильным именем переменной среды, используйте его вместо этого (обратите внимание на одинарные кавычки):

grep -vrl '$$DEMO_STUDENT_NAME' /d/demo/

или это:

grep -rlL '$$DEMO_STUDENT_NAME' /d/demo/

Вот подтверждение концепции:

$ mkdir temp
$ echo 'teste' > temp/file1
$ echo 'teste' > temp/file2
$ echo 'teste' > temp/file3
$ echo 'work' > temp/file4
$ grep -vrl teste temp/
temp/file4
$ grep -rlL teste temp/
temp/file4
$ grep -V
grep (GNU grep) 2.20
Copyright (C) 2014 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Written by Mike Haertel and others, see <http://git.sv.gnu.org/cgit/grep.git/tree/AUTHORS>.
0 голосов
/ 17 октября 2019

Ниже приведен код, работающий, как и ожидалось. Немного изменен с учетом ссылки из @ dash-o

_Dir='/d/d1/Demo'
_P='/d/files'

find $_Dir -type f -iname "*.txt"  >> $_P/Demo.csv

for file in `cat $_P/Demo.csv` 
do
    if ! fgrep -q '$$DEMO_STUDENT_NAME' $file
    then
        echo "$file" >> $_P/keyword_not_found.csv 
    fi
done
0 голосов
/ 17 октября 2019

Можно найти дополнение к набору файлов для такой задачи:

(grep -l $PATTERN $FILE_LIST ; ls $FILE_LIST ) | sort | uniq -u
0 голосов
/ 17 октября 2019

Мне нравится использовать grep -c (затем проверка по трейлингу ': 0') для такого рода задач:

grep  -c  $PATTERN $FILE_LIST |  grep :0\$   | sed -e s/:0\$//
0 голосов
/ 17 октября 2019

Если у вас есть список файлов во FLIST, вы можете найти файлы без совпадений. Поищите -L / - files-без соответствия

grep --files-without-match '$$DEMO_STUDENT_NAME' $FLIST

Если у вас более старая версия grep, без опции --files-Without-Match, вы можете использовать следующий цикл:

for file in $FLIST ; do
    if ! fgrep -q '$$DEMO_STUDENT_NAME' $file ; then
        echo "$file"
    fi
done
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...