2014-01-07 8 views
3

У меня есть команда AWK для извлечения информации из точек монтирования (см принятого ответа в How to extract NFS information from mount on Linux and Solaris?):Как включить поиск в awk?

awk -F'[: ]' '{if(/^\//)print $3,$4,$1;else print $1,$2,$4} 

Я хотел бы, чтобы включить поиск копаться в этой awk команды для запроса IP имен хостов. К сожалению, команда mount иногда включает IP, а иногда и имя хоста. Я попытался следующие, но она имеет нежелательную строку, нежелательный код возврата и не работает, если есть IP-адрес:

Для хостов

echo "example.com:/remote/export on /local/mountpoint otherstuff" | awk -F'[: ]' '{if(/^\//)print system("dig +short " $3),$4,$1;else print system("dig +short " $1),$2,$4}' 

Возвращает

93.184.216.119 
0 /remote/export /local/mountpoint 

Для IP-адресов

echo "93.184.216.119:/remote/export on /local/mountpoint otherstuff" | awk -F'[: ]' '{if(/^\//)print system("dig +short " $3),$4,$1;else print system("dig +short " $1),$2,$4}' 

Возвращает

0 /remote/export /local/mountpoint 

Я хотел бы получить следующие в обоих случаях

93.184.216.119 /remote/export /local/mountpoint 

Update:

, кажется, что некоторые версии возвращении IP, когда IP предоставляется как запрос, а другие ничего не возвращают.

Решение:

На основе accepted answer я использовал следующую адаптированную awk команду:

awk -F'[: ]' '{if(/^\//) { system("dig +short "$3" | grep . || echo "$3" | tr -d \"\n\""); print "",$4,$1 } else { system("dig +short "$1" | grep . || echo "$1" | tr -d \"\n\"");print "",$2,$4 };}' 

Дополнительный grep . || echo "$3" Заботится о том, что ввод IP/имя хоста возвращается, если рыть ничего не возвращает.

ответ

3

Команда system в awk выполняет команду, возвращает ее статус. Рассмотрим это:

$ awk 'END { print "today is " system("date") " and sunny" }' < /dev/null 
Tue Jan 7 20:19:28 CET 2014 
today is 0 and sunny 

The date команда выводит дату и перевода строки. При работе от awk происходит то же самое. В этом примере system заканчивается до printf, поэтому сначала мы видим строку с датой, а на следующей строке - наш текст с возвращаемым значением 0 system.

Чтобы получить то, что мы хотим, мы должны разделить это на нескольких команд и нам не нужно возвращаемое значение system:

$ awk 'END { printf "today is "; system("date | tr -d \"\n\""); print " and sunny" }' < /dev/null 
today is Tue Jan 7 20:24:01 CET 2014 and sunny 

Чтобы предотвратить перевод строки после date, мы конвейер своего выхода tr -d "\n".

Короче говоря, переход от этого:

print system(...), $2, $4 

к этому:

system(... | tr -d \"\n\"); print "", $2, $4