Как использовать grep stderr? [дубликат]

Возьмем этот образец файла:

$ cat file.txt
        =putSomething here;

Теперь, чтобы найти все такие .txtфайлы в текущем каталоге:

$ grep -n '^[[:space:]]*=' *.txt
file.txt:1:        =putSomething here;

Если вы хотите найти все такие .txtфайлы в текущем каталоге и во всех его подкаталогах, затем используйте:

$ grep -rn '^[[:space:]]*=' --include '*.txt'
subdir/another.txt:1:        =putSomething here;
file.txt:1:        =putSomething here;

Примечания

  1. findи xargsздесь не нужны . С опцией -rgrepвыполняет рекурсивный поиск в подкаталогах.

  2. --include '*.txt'ограничивает grepфайлами, соответствующими glob *.txt.

  3. ^соответствует началу строки. [[:space:]]*соответствует нулю или более пробельным символам. =соответствует знаку равенства. В регулярных выражениях POSIX нет ничего особенного в = , поэтому его можно рассматривать как любой другой символ.

  4. Завершение регулярного выражения grep с помощью .*$не меняет совпадающие строки. .*$совпадает либо с любыми символами, либо без символов. Единственная причина использовать .*$— изменить то, что grep выделяет как совпадающий текст.

0
30.06.2016, 01:37
2 ответа

Подстановочный знак не имеет никакого отношения к grep, все, что видит grep - это то, что передается ему по трубопроводу. Подстановочный знак расширяется оболочкой, а список файлов, до которых он расширяется, передается в less. Так что проблема не имеет никакого отношения к grep.

Тем не менее, если вы ищете неработающие ссылки, вы можете сделать следующее:

for f in /Users/raine/.nvm/versions/node/v5.5.0/lib/node_modules/*; do
     [ -e $(readlink -f "$f") ] || echo "$f"; 
done

Это позволит перебрать все файлы и каталоги в /Users/raine/.nvm/versions/node/v5.5.0/lib/node_modules/, проверить, существует ли их цель (readlink выведет имя файла, для которого был запущен iot, если этот файл не является ссылкой) и вывести имя, если нет.


Гораздо лучшее решение, о котором я только что узнал:

find /Users/raine/.nvm/versions/node/v5.5.0/lib/node_modules/ -xtype l 

-xtype будет проверять, является ли цель ссылки, в данном случае, ссылкой, так что это будет верно только для висячих ссылок.

2
28.01.2020, 02:27

Как @SatoKatsura указал в своем комментарии, (хакерское) использование less выводится на stderr , а grep читает из stdout . Хотя это плохое решение фактической задачи поиска мертвых символических ссылок, оно может работать, перенаправляя stderr на stdout :

less ~/.nvm/versions/node/v5.5.0/lib/node_modules/* 2>&1 | grep "Not a file"
1
28.01.2020, 02:27

Теги

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