Linux использует grep для печати имени файла и первых n символов - PullRequest
2 голосов
/ 17 декабря 2008

Как мне использовать grep для поиска, который при обнаружении совпадения будет печатать как имя файла, так и первые n символов в этом файле? Обратите внимание, что n - это параметр, который можно указывать, и не имеет значения, содержат ли первые n символов соответствующую строку.

Ответы [ 4 ]

5 голосов
/ 17 декабря 2008
grep -l pattern *.txt | 
    while read line; do 
        echo -n "$line: "; 
        head -c $n "$line"; 
        echo; 
     done

Измените -c на -n, если вы хотите видеть первые n строки вместо байтов.

4 голосов
/ 17 декабря 2008

Вам нужно передать вывод команды grep в sed, чтобы выполнить то, что вы хотите. Вот пример:

grep mypattern *.txt | sed 's/^\([^:]*:.......\).*/\1/'

Количество точек - это количество символов, которое вы хотите напечатать. Многие версии sed часто предоставляют опцию, например -r (GNU / Linux) и -E (FreeBSD), которая позволяет использовать регулярные выражения в современном стиле. Это позволяет численно указать количество символов, которые вы хотите напечатать.

N=7
grep mypattern *.txt /dev/null | sed -r "s/^([^:]*:.{$N}).*/\1/"

Обратите внимание, что это решение намного эффективнее, чем другие, которые вызывают несколько процессов.

3 голосов
/ 17 декабря 2008

Существует несколько инструментов, которые печатают «n символов», а не «n строк». Вы уверены, что действительно хотите символы, а не линии? Все это, возможно, лучше всего сделать в Perl. Как указано (используя grep), мы можем сделать:

pattern="$1"
shift
n="$2"
shift
grep -l "$pattern" "$@" |
while read file
do
    echo "$file:" $(dd if="$file" count=${n}c)
done

Кавычки вокруг $file правильно сохраняют несколько пробелов в именах файлов. В настоящее время мы можем обсудить использование командной строки (при условии, что имя команды равно «ngrep»):

 ngrep pattern n [file ...]

Замечу, что @litb used 'head -c $n'; это лучше, чем команда dd, которую я использовал. Могут быть некоторые системы без head (но они довольно архаичны). Замечу, что версия POSIX head поддерживает только -n и количество строк; опция -c, вероятно, является расширением GNU.

0 голосов
/ 17 декабря 2008

Две мысли здесь:

1) Если эффективность не была проблемой (как это могло бы случиться), вы можете проверить $ status [csh] после запуска grep для каждого файла. Например: (для N символов = 25 .)

foreach FILE ( file1 file2 ... fileN )
  grep targetToMatch  ${FILE} > /dev/null
  if ( $status == 0 ) then
     echo -n "${FILE}:  "
     head -c25 ${FILE}
  endif
end

2) GNU [FSF] head содержит - подробный [- v] переключатель. Он также предлагает - null для размещения имен файлов с пробелами. И есть '-' , для обработки имен файлов, таких как "- c" . Так что вы могли бы сделать:

grep --null -l targetToMatch -- file1 file2 ... fileN |
xargs --null head -v -c25 --
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...