Как включить копать поиск в awk?
У меня есть команда awk для извлечения информации из точек монтирования (см. Принятый ответ в разделе Как извлечь информацию NFS из монтирования в Linux и Solaris?):
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
Обновить:
Кажется, что некоторые версии 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 ничего не возвращает.
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