2016-09-29 5 views
1

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

IP[TAB]MAC[TAB]VENDOR[TAB]HOSTNAME 

Это результат, который я хотел бы иметь:

192.168.1.1[TAB]54:a0:50:xx:xx:xx[TAB]ASUSTek COMPUTER INC.[TAB]Router 
192.168.1.2[TAB]60:33:4b:xx:xx:xx[TAB]Apple, Inc.[TAB]iMac-John 
192.168.1.52[TAB]08:ed:b9:xx:xx:xx[TAB]Apple, Inc.[TAB]iMac-Peter 
192.168.1.26[TAB]c0:11:73:xx:xx:xx[TAB]Samsung Electronics Co.,Ltd[TAB]Erik's Android 

я могу получить первые три колонки легко с помощью этой команды:

sudo arp-scan -l | tail -n +3 | head -n -3 

Результат:

192.168.1.1[TAB]54:a0:50:xx:xx:xx[TAB]ASUSTek COMPUTER INC. 
192.168.1.2[TAB]60:33:4b:xx:xx:xx[TAB]Apple, Inc. 
192.168.1.52[TAB]08:ed:b9:xx:xx:xx[TAB]Apple, Inc. 
192.168.1.26[TAB]c0:11:73:xx:xx:xx[TAB]Samsung Electronics Co.,Ltd 

Проблема заключается в том, чтобы добавить 4-й столбец, я пытаюсь сделать это с awk команды, но я получаю результат в новой строке вместо формате мне нравится.

sudo arp-scan -l | tail -n +3 | head -n -3 | awk -F '\t' '{ print $0 system("getent hosts " $1) }' 

Неожиданный результат:

192.168.1.1[TAB]Router 
192.168.1.1[TAB]54:a0:50:xx:xx:xx[TAB]ASUSTek COMPUTER INC. 
192.168.1.2[TAB]iMac-John 
192.168.1.2[TAB]60:33:4b:xx:xx:xx[TAB]Apple, Inc. 
192.168.1.52[TAB]iMac-Peter 
192.168.1.52[TAB]08:ed:b9:xx:xx:xx[TAB]Apple, Inc. 
192.168.1.26[TAB]Erik's Android 
192.168.1.26[TAB]c0:11:73:xx:xx:xx[TAB]Samsung Electronics Co.,Ltd 

Любая помощь будет оценен по достоинству!

+4

[править] Ваш вопрос, чтобы включить краткие, проверяемые вход образца (выход Sudo arp- scan -l) и ожидаемый результат. –

+0

Предположительно, IP-адрес является общим ключом. Исследуйте команду 'join'. –

ответ

2

Правильный синтаксис для текущей команды AWK является:

awk 'BEGIN { FS=OFS="\t" } 
{ 
    cmd="getent hosts \"" $1 "\"" 
    $0 = $0 OFS ((cmd | getline line) > 0 ? line : "N/A") 
}1' 

но вы определенно не нужны tail, так как вы можете просто сделать NR>2{...} в AWK и есть хороший шанс, что вы не нуждаетесь в head либо, не видя необработанного вывода arp-scan, мы можем только догадываться.

Кроме того - если это все, что вы делаете с AWK, то вы, вероятно, следует использовать оболочку вместо:

while IFS=$'\t' read -r ip rest; do 
    printf '%s\t%s\t%s\n' "$ip" "$rest" $(getent hosts "$ip") 
done 
+0

Спасибо за ответ! Я обнаружил, что строки с HOSTNAME в конце разделителя не являются [TAB], но строки с N/A - это [TAB], как я могу это исправить? –

+1

Добро пожаловать, но это невозможно. Вкладка создается «FS», которая сидит ПЕРЕД тройным выражением, поэтому вкладка IS присутствует независимо от того, следует ли за ней имя хоста или N/A. Независимо от того, выполняет ли сценарий 'print $ 0 '\ t" hostname' или 'print $ 0" \ t "" N/A ", результат начинается с' $ 0 "\ t" 'в любом случае. Это 'FS' действительно должно быть« OFS »btw, поэтому я собираюсь обновить ответ, но это просто косметическое изменение и абсолютно нулевое различие функционально, поскольку обе переменные имеют значение' \ t'. –

Смежные вопросы