Grep каталог и возврат перечисляют с номерами строки

От видео похоже, что они используют PCM. На Ubuntu пытаются использовать/dev/snd/pcm*

5
16.12.2018, 13:35
6 ответов

Многие grep варианты реализуют рекурсивную опцию. Например, GNU grep

-R, -r, --recursive
          Read all files under each directory, recursively; this is equivalent to the -d recurse option.

Можно затем удалить find:

grep -n -r $pattern $path | awk '{ print $1 }'

но это сохраняет больше, чем номер строки. awk печатает первый столбец. Этот пример

src/main/package/A.java:3:import java.util.Map;
src/main/package/A.java:5:import javax.security.auth.Subject;
src/main/package/A.java:6:import javax.security.auth.callback.CallbackHandler;

будет распечатан как

src/main/package/A.java:3:import
src/main/package/A.java:5:import
src/main/package/A.java:6:import

заметьте :import в каждой строке. Вы могли бы хотеть использовать sed отфильтровать вывод.

С тех пор a : мог присутствовать в имени файла, которое можно использовать -Z опция grep произвести nul символ (\0) после имени файла.

grep -rZn $pattern $path | sed -e "s/[[:cntrl:]]\([0-9][0-9]*\).*/:\1/" 

с тем же примером как прежде произведет

src/main/package/A.java:3
src/main/package/A.java:5
src/main/package/A.java:6
6
27.01.2020, 20:36
  • 1
    Потрясающий - большое спасибо за это. Особенно включая sed бит. –  Zack Hovatter 29.11.2011, 23:58
  • 2
    или канал это к awk как это grep -rZn $pattern $path | awk -F: '{print $2,$1}' и получите симпатичные результаты! :) –  jaypal singh 30.11.2011, 00:18
  • 3
    Не Был бы -Z и -F: не соответствуют здесь, @Jaypal? Вы хотели бы заменить \0 символов явно: grep -rZn "$pattern" "$path" | awk -F: {sub(/\0/,":",$1);print $1}' –  Arcege 30.11.2011, 04:47
  • 4
    Ahh Вы корректны. Это должно быть grep -n -r $pattern $path | awk -F: '{print $2,$1}' –  jaypal singh 30.11.2011, 05:38
  • 5
    @Jaypal GPT_Parser.sh не содержит a ':' символ. awk разделяет на: как мог он распознавать если: часть имени? Или я пропускал что-то? Попробуйте файлом под названием "test:file:with:.txt" –  Matteo 30.11.2011, 08:43

Для первой части отметьте это xargs только работы, при отсутствии пробельных символов или \'" в Ваших именах файлов. Посмотрите, Как искать слово во всем содержании каталога в Linux для объяснения и альтернативы.

Кроме того, всегда помещаемые двойные кавычки вокруг подстановок переменных: "$path". Без двойных кавычек оболочка разворачивает пробел и подстановочные знаки в значении $path, так использование его закрыло кавычки повреждения, если у Вас есть пробел или подстановочные знаки в том имени файла. То же идет для $pattern (только для смеха, попытайтесь пропустить кавычки и искать h* в каталоге, содержащем названные файлы hi и hello).

Если Ваша версия grep имеет -r опция пересечь каталоги рекурсивно, Вам не нужно find здесь. -r опция присутствует на Linux, FreeBSD,  Mac OS X и Cygwin среди других. Иначе:

find "$path" -type f -exec grep -Hn "$pattern" {} + | awk -F: '{print $1 ":" $2}'

Я зафиксировал Ваш awk звоните выше, также, так, чтобы это распечатало только имя файла и номера строки. Я также передаю -H опция к grep, гарантировать, что это всегда печатает имя файла, даже если, оказывается, существует единственный файл. Этот код предполагает, что Ваши имена файлов не содержат : или новые строки; если бы они могли бы, вещи, которые будут сложными, и Вы лучше или полагались бы на grep's GNU -Z опция или процесс файлы индивидуально:

find "$path" -type f -exec sh -c 'for x; do grep -n "$0" <"$x" | awk -v fn="$x" -F: 'print fn ":" $1'; done' "$pattern" {} +
3
27.01.2020, 20:36
  • 1
    Это предполагает, что файл не содержит ":" символьный –  Matteo 30.11.2011, 08:35
  • 2
    @Matteo или новые строки. –  Gilles 'SO- stop being evil' 30.11.2011, 10:08

Я избавился бы от grep и используйте awk:

find $path -type f -print0 | xargs -0 awk "/$pattern/{print FILENAME,FNR}"

Но использование grep и cut:

find $path -type f -print0 | xargs -0 grep -nH "$pattern" | cut -d: -f1,2

Включайте -type f пункт, таким образом, Вы не получаете ошибки, пытающиеся искать (или в grep или в awk) на нерегулярных типах файлов (символьные ссылки, каталоги, сокеты). Если Вы читаете из канала или сокета, когда другая программа, как предполагается, то Вы могли бы испортить ту программу.

find ... -print0 | xargs -0 обходит пробел наличия в именах файлов. Это не доступно в каждой системе UNIX, но находится на большинстве.

1
27.01.2020, 20:36

Не уверенный, что точно Вы пытаетесь сделать здесь.

find $path | xargs grep -n $pattern | awk '{print $1}'

Мне это переводит, чтобы найти все файлы в $path, и искать их с пронумерованными строками за $pattern шаблона и распечатать номер строки и первое слово строки, которая соответствует $pattern. (возможно не включая сам $pattern)

Если это так, затем Вы немного изобретаете велосипед. Можно сделать все это непосредственно от команды находки без дополнительного штрафа канала xargs.

find $path -exec grep -n $pattern {} \; -print | awk '{print $1}'

или удалите канал awk для всего содержания строки.

Используя собственную находку -exec обладает дополнительным преимуществом корректной обработки пробела в именах файлов.

0
27.01.2020, 20:36

проверьте -c и -n полезные опции также.

0
27.01.2020, 20:36

Вот то, что я сделал бы:

  • избегайте использования такого количества каналов. Каждый раз, когда возможно, используйте обходное решение. Вместо find . | grep -n <> почему бы не использовать -exec?

    • Можно также использовать в своих интересах Замену Процесса.

Попытайтесь делать следующее:

awk '{print $1}' <(find $path -exec grep -n $pattern {} \;)

NB: Это может работать, как, или с небольшим изменением, в зависимости от оболочки и версии find Вы используете.

-1
27.01.2020, 20:36

Теги

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