grep из списка ключевых слов

Я бы рекомендовал использовать grepи коды возврата, чтобы сделать жизнь немного проще.

while read -r LINE
do
    find. -name "${LINE}" | grep "${LINE}" || echo "${LINE} not found"

done < /path/to/fnames.txt

Как это работает:

  • find. -name "${LINE}"уверен, что вы знаете это, найдите файлы в текущем каталоге, которые соответствуют${LINE}
  • | grep "${LINE}"направить вывод на grep. Мы делаем это для получения возвращаемого значения, которое findобычно не дает полезного значения. Если grepсоответствует чему-либо, совпадение будет напечатано, и команда вернет 0. Если ничего не совпадает, ничего не будет напечатано, и будет возвращено ненулевое возвращаемое значение -.

  • || echo "${LINE} not found"||является каналом ИЛИ, если одна из команд до того, как она вернет не -ноль, она будет выполнена. Таким образом, если grepвозвращает не -ноль (, т. е. не найдены соответствующие файлы ), выполняется это эхо. Если команды перед этим успешны, это не будет выполнено.

1
22.04.2019, 02:40
2 ответа

Ваша догадка была довольно близка. Вы можете сделать

for w in 'KeyWord1' 'KeyWord2' 'KeyWord3'
do
    echo "<HR><BR><B><h2>Search for Keyword:  $w<BR></B></h2><ol>"  >> temp.txt
    grep -lr -Fiw "$w" * | sed -e 's|.*|<li><a href="http://&">&</a></li>|'  >>  temp.txt
    echo "</ol>"   >> temp.txt
done

Из соображений стиля я бы изменил это на

for w in 'KeyWord1' 'KeyWord2' 'KeyWord3'
do
        echo "<HR><BR><B><h2>Search for $w:  KeyWord1<BR></B></h2><ol>"
        grep -lr -Fiw "$w" * | sed -e 's|.*|<li><a href="http://&">&</a></li>|'
        echo "</ol>"
done  > temp.txt

Ваша версия добавит это новое содержимое к ранее -существующему temp.txtфайлу. Если это то, чем ты действительно хочешь заниматься, измените >обратно на >>. После этого он (бесконечно )более эффективен открыть temp.txtдля записи один раз на весь цикл а не три раза для каждого ключевого слова.

П.С. Это просто пришло мне в голову что вы, вероятно, написали <html><head>…</head><body>в выходной файл, прежде чем сделать это, так что, конечно, вам нужно добавить это к этому предварительно -существующему контенту.

0
28.01.2020, 00:14

Привет, Дэвид. Я бы добавил комментарий к ответу G -Man, но мне нечего сказать.

Просто хотел добавить, что с рекурсивным grep вы, вероятно, захотите указать каталог или каталоги для поиска, а не подстановочный знак, поэтому что-то вроде grep -lr -Fiw "$w". …вместо.

0
28.01.2020, 00:14

Теги

Похожие вопросы