Как включить поиск в awk?

У меня есть команда awk для извлечения информации из точек монтирования (см. принятый ответ в Как извлечь информацию NFS из монтирования в Linux и Solaris?):

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

Я хотел бы включить поиск dig в эту команду 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

Обновление:

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

Решение:

Основываясь на принятом ответе, я использовал следующую адаптированную команду 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-адрес/имя хоста возвращался, если dig ничего не возвращает.


person Florian Feldhaus    schedule 07.01.2014    source источник


Ответы (1)


Команда 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

Команда 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
person janos    schedule 07.01.2014