От видео похоже, что они используют PCM. На Ubuntu пытаются использовать/dev/snd/pcm*
Многие 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
Для первой части отметьте это 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" {} +
Я избавился бы от 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, но находится на большинстве.
Не уверенный, что точно Вы пытаетесь сделать здесь.
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
обладает дополнительным преимуществом корректной обработки пробела в именах файлов.
Вот то, что я сделал бы:
избегайте использования такого количества каналов. Каждый раз, когда возможно, используйте обходное решение. Вместо find . | grep -n <>
почему бы не использовать -exec
?
Попытайтесь делать следующее:
awk '{print $1}' <(find $path -exec grep -n $pattern {} \;)
NB: Это может работать, как, или с небольшим изменением, в зависимости от оболочки и версии find
Вы используете.
-exec
, но я определенно сделаю некоторое чтение затем. ползунки
– Zack Hovatter
30.11.2011, 00:12
\[*?
. Посмотрите, Как искать слово во всем содержании каталога в linux
– Gilles 'SO- stop being evil'
30.11.2011, 03:39
sed
бит. – Zack Hovatter 29.11.2011, 23:58awk
как этоgrep -rZn $pattern $path | awk -F: '{print $2,$1}'
и получите симпатичные результаты! :) – jaypal singh 30.11.2011, 00:18-Z
и-F:
не соответствуют здесь, @Jaypal? Вы хотели бы заменить \0 символов явно:grep -rZn "$pattern" "$path" | awk -F: {sub(/\0/,":",$1);print $1}'
– Arcege 30.11.2011, 04:47grep -n -r $pattern $path | awk -F: '{print $2,$1}'
– jaypal singh 30.11.2011, 05:38