Невозможно отфильтровать строки, содержащие «Является каталогом» по SED / AWK - PullRequest
1 голос
/ 24 марта 2009

Я запускаю код, который дает мне следующий пример данных

md5deep find * | awk '{ print $1 }'

Образец продукции

    /Users/math/Documents/Articles/Number theory: Is a directory
    258fe6853b1bfb2d07f512ff6bec52b1
    /Users/math/Documents/Articles/Probability and statistics: Is a directory
    4811bfb2ad04b9f4318049c01ebb52ef
    8aae4ac3694658cf90005dbdea37b4d5
    258fe6853b1bfb2d07f512ff6bec52b1

Я попытался отфильтровать строки, содержащие Является ли каталог по SED безуспешно

md5deep find * | awk '{ print $1 }' | sed s/\/*//g

Пример вывода

/Users/math/Documents/Articles/Number theory: Is a directory
/Users/math/Documents/Articles/Topology: Is a directory
/Users/math/Documents/Articles/useful: Is a directory

Как отфильтровать каждую строку, содержащую «Является ли каталог» по SED / AWK?

[разъяснение] Я хочу отфильтровать строки, которые содержат Является ли каталог .

Ответы [ 4 ]

2 голосов
/ 25 марта 2009

Чтобы конкретно ответить на уточнение: как отфильтровать строки, используя awk и sed:

awk '/Is a directory/ {next} {print}'
sed 'g/Is a directory/d'
2 голосов
/ 24 марта 2009

Я не использовал инструмент md5deep, но я считаю, что эти строки являются сообщениями об ошибках; они будут идти к стандартной ошибке вместо стандартного выхода, и поэтому они будут идти прямо к вашему терминалу, а не через канал. Таким образом, они не будут отфильтрованы вашей командой sed. Вы можете отфильтровать их, объединив ваши стандартные ошибки и стандартные выходные потоки, но

Похоже (я не уверен, потому что вам не хватает обратных кавычек) вы пытаетесь позвонить

md5deep `find *`

и find возвращает все файлы и каталоги.

Несколько замечаний о том, что вы можете сделать:

  • Похоже, у md5deep есть опция -r для "рекурсивного" параметра. Итак, вы можете попробовать:

    md5deep -r *
    

    вместо команды поиска.

  • Если вы хотите использовать команду find, вы можете ограничить ее только файлами, использующими -type f, вместо файлов и каталогов. Кроме того, вам не нужно передавать * в команду поиска (что может сбить с толку find, если есть файлы с именами, похожими на параметры, которые понимает find); передача в . будет рекурсивно искать в текущем каталоге.

    find . -type f
    
  • В sed, если вы хотите использовать косые черты в вашем шаблоне, может быть затруднительно правильно цитировать их с помощью \. Вместо этого вы можете выбрать другой символ для ограничения вашего регулярного выражения; sed будет использовать первый символ после команды s в качестве разделителя. Вашему шаблону также не хватает .; в регулярных выражениях, чтобы указать один экземпляр любого символа, который вы используете ., и чтобы указать «ноль или более предшествующего выражения», вы используете *, поэтому .* означает «ноль или более любого символа» (это отличается от шаблонов глобуса, в которых * означает «ноль или более любого символа»).

    sed "s|/.*||g"
    
  • Если вы действительно хотите включить стандартный поток ошибок в стандартный вывод, чтобы он проходил через канал, тогда вы можете выполнить:

    md5deep `find *` 2>&1 | awk ... 
    
  • Если вы просто хотите игнорировать stderr, вы можете перенаправить его на /dev/null, который является специальным файлом, который просто отбрасывает все, что входит в него:

    md5deep `find *` 2>/dev/null | awk ...
    

В целом, я думаю, что приведенная ниже команда поможет вам решить вашу непосредственную проблему, а другие перечисленные выше рекомендации могут помочь вам, если я не понял, что вы искали:

md5deep -r * | awk '{ print $1 }'
1 голос
/ 24 марта 2009

Почему бы вместо этого не использовать grep?

е

md5deep find * | grep "Is a directory" | awk '{ print $1 }'

Редактировать: я просто перечитал ваш вопрос и, если вы хотите удалить строки с каталогом Is, используйте флаг -v grep, то есть:

md5deep find * | grep -v "Is a directory" | awk '{ print $1 }'
0 голосов
/ 24 марта 2009

Я не очень хорошо знаком с md5deep, но это может сделать то, что вы пытаетесь сделать.

find -type f -exec md5sum {} +
...