Как найти каждый файл в моем репо, который имеет конкретное c слово в последней строке? - PullRequest
0 голосов
/ 14 февраля 2020

Другими словами, как объединить команду tail и find / grep в bash. Я хочу найти, что все файлы (включая файлы в подкаталогах) в моем репо имеют указанное c слово в последней строке, скажем, FIX в последней строке. Я попытался grep -Rl "FIX" отобразить все файлы, содержащие «FIX», но я не знаю, как объединить в нем команду tail. Любой может помочь ??

Ответы [ 2 ]

0 голосов
/ 14 февраля 2020

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

find . -exec sh -c "sed -n '$ { /FIX/p; }' {} | grep -q . " \; -print

Здесь мы используем -n для подавления печати, а затем печатаем (с /p) только тогда, когда последняя строка соответствует шаблону /FIX/. Выходные данные передаются в grep, чтобы получить возвращаемое значение, которое find использует, чтобы решить, следует ли -print имя.

Или вы можете избежать использования grep для возврата, выполнив что-то вроде:

find . -exec awk 'END{ exit ! match($0, "FIX")}' {} \; -print
0 голосов
/ 14 февраля 2020

Запустите tail на всех файлах одновременно, а затем выполните grep для вывода FIX. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

* * * * * * * * *1004* * * * * * * * * * * * *1004* * * * * * * * * * * * * * * * * * * * * * * * * * * 'ЕГО НЕ ИСПОЛЬЗУЕТ' '* * * * * * * * * * * * * * * * * * 100' 'или'

. * * на каждом из них по одному:

shopt -s globstar
for file in **; do
    [[ -f $file ]] && tail -n1 "$file" | grep -q FIX && echo "$file"
done

Или используйте find, чтобы найти все совпадения и направьте его к while read l oop:

find -type f -print0 | while IFS= read -rd '' file; do
    tail -n1 "$file" | grep -q FIX && echo "$file"
done

Или сделать то же самое, но с -exec + и явной под-оболочкой:

find -type f -exec sh -c 'for file; do tail -n1 "$file" | grep -q FIX && echo "$file"; done' sh {} +
...