устранить нежелательный вывод с помощью awk и sed - PullRequest
1 голос
/ 28 марта 2012

Из следующей команды, как я могу удалить все строки, которые встречаются до

 Owner     RepoName             CreatedDate

Команда РЕДАКТИРОВАНИЯ:

find /opt/site/ -name '.log.txt' | xargs cat | awk '{$NF=""; print $0}' | sed '1i Owner RepoName CreatedDate' | column -t

Вывод

find: Filesystem loop detected; `/nfs/.snapshot/nightly.4' has the same device number and inode as a directory which is 2 levels higher in the filesystem hierarchy.
find: Filesystem loop detected; `/nfs/.snapshot/nightly.5' has the same device number and inode as a directory which is 2 levels higher in the filesystem hierarchy.
find: Filesystem loop detected; `/nfs/.snapshot/nightly.6' has the same device number and inode as a directory which is 2 levels higher in the filesystem hierarchy.
Owner     RepoName             CreatedDate
val        abc                  Fri          Mar  16  17:01:07  PDT
p1         repo_pc              Wed          Mar  21  11:34:42  PDT
New        fm                   Mon          Mar  19  00:15:51  PD 

Требуется только вывод:

Owner     RepoName             CreatedDate
val        abc                  Fri          Mar  16  17:01:07  PDT
p1         repo_pc              Wed          Mar  21  11:34:42  PDT
New        fm                   Mon          Mar  19  00:15:51  PD 

Ответы [ 4 ]

3 голосов
/ 28 марта 2012

Эти ошибки поиска будут на stderr, поэтому, обходя цепочку полностью, вы захотите перенаправить ошибки с помощью 2>/dev/null, хотя это помешает вам увидеть другие ошибки в команде поиска.

find /opt/site/ -name '.log.txt' 2>/dev/null | xargs cat | awk '{$NF=""; print $0}' | xargs sed "/Filesystem/d" | sed '1i Owner RepoName CreatedDate' | column -t

Как правило, с помощью сложной команды, подобной этой, вы должны разбивать ее, когда у вас есть ошибки, чтобы вы могли определить причину проблемы.

Давайте разберем эту команду, чтобы посмотреть, что она делает:

find /opt/site/ -name '.log.txt' 2>/dev/null - найти все файлы в / opt / site / с именем .log.txt

xargs cat - получить все их содержимое, один за другим

awk '{$NF=""; print $0}' - удалить последний столбец

xargs sed "/Filesystem/d" - рассматривать каждую запись как файл и удалять любые строки, содержащие файловую систему, из содержимого этих файлов.

sed '1i Owner RepoName CreatedDate' - вставить владельцаRepoName CreatedDate в первой строке

column -t - преобразовать данные в таблицу

Я бы предложил создать команду и проверить правильность вывода на каждом этапе.

Несколько вещейУдивительно, что ваша команда:

  1. Find ищет файлы, которые являются точно .log.txt, а не расширением.
  2. Второй вызов xargs - преобразование содержимого .logTXT-файлы в имена файлов.
0 голосов
/ 29 марта 2012

Следующая sed команда должна выполнить работу (использовать ее с входным файлом или из канала):

sed -n '/^Owner/,$ p'

Объяснение:

-n             # Disable auto-print.
/^Owner/       # From a line beginning with 'Owner'...
$              # ...until end of input...
p              # print
0 голосов
/ 29 марта 2012

К сожалению, вы, похоже, используете csh или tcsh, где трудно перенаправить стандартную ошибку отдельно от стандартного вывода.В противном случае ответ Дугласа сработал бы.Но попробуйте это:

(find /opt/site/ -name '.log.txt' | xargs cat | awk '{$NF=""; print $0}' | sed '1i Owner RepoName CreatedDate' | column -t > output) >&/dev/null

Обратите внимание на символы, окружающие основную часть команды.Внутри этих символов есть перенаправление для отправки стандартного вывода в файл с именем «output» вместо вашего терминала (назовите его как хотите - или замените output на /dev/tty, если вы действительно хотите видеть его в своем терминале),Помимо этих паренов, есть перенаправление для отправки оставшихся сообщений об ошибках на /dev/null.

Все это жалкий комментарий на долговечность ужасных оболочек.

0 голосов
/ 28 марта 2012

Вы можете исключить вывод ошибки из поиска, добавив 2> / dev / null к части команды find перед первым каналом. [Редактировать: это лучший способ, и я проголосовал за Дугласа, так как он был здесь первым;)]

Но если вы действительно хотите сделать это с помощью sed или awk (не можете подумать почему?), Вы можете изменить свой скрипт awk так, чтобы пропустить строки, начинающиеся с 'find:':

awk '/^find:/ {next;} {$NF=""; print $0}' 
...