Настройте команду grep, чтобы избежать «лишних» строк

268
susik

Я должен найти текст внутри заархивированных файлов. Я использую Cygwin. Некоторые заархивированные файлы пусты. Очевидно, я вообще не хочу иметь «шумную» информацию об этих «пустых zip-файлах». Например

find . -iname '*.zip' -print -exec unzip -l {} \; |grep -i vbs 

Где vbsстрока, которую я ищу.

Проблема в том, что он возвращает то, что я ищу, но он также возвращает много шума с такими строками:

C\ProgramData\ABC\DEF\VBScripts\OutputArchiveFiles.vbs warning [/z/XYZ/Backup/123/456/Backup Set 1/Backup Files 1/Backup files 2.zip]: zipfile is empty 

Я не хочу видеть эти строки с "zipfile is empty"

Я попытался передать это, |grep -v 'zipfile is empty'но он все еще выводит эти строки.

Мой вопрос: как мне избежать печати этих «пустых» строк и видеть только те строки, которые я ищу; то есть vbs?

1

1 ответ на вопрос

1
Jedi

Those additional lines are probably in the stderr stream. You could test by seeing if they redirect out to a separate file (e.g. command 2> error.txt)

Basically, run:

find . -iname '*.zip' -print -exec unzip -l {} \; 2> error.txt |grep -i vbs 

If this fixes your problem, you can replace error.txt with /dev/null (this may not work on all versions of cygwin)

Спасибо за ответ, но перенаправление на 2> не имело никакого значения, т. Е. Файл error.txt создан, он пуст, и я все еще напечатал много «пустых» строк. Любое другое предложение? Спасибо susik 7 лет назад 0
- Джедай, спасибо большое, не прекрасно работает. Последний запрос: текущая реализация find. -iname '* .zip' -print -exec unzip -l {} \; 2> error.txt | grep -i vbs ... будет соответствовать шаблону в имени файла. НО в большинстве случаев мне нужно найти файл на основе содержимого, например, vbs не является частью имени файла, а частью содержимого файла. Не могли бы вы помочь мне, т.е. включить поиск по содержимому файла. Еще раз спасибо и ценим вашу помощь susik 7 лет назад 0