как найти значение из одного файла (IP адрес) в другом файле (IP пробел имя пользователя)

BASH + AWK – поиск содержимого одного файла в другом и вывод значения рядом с ним

Это мне понадобилось, чтобы решить задачу смены пароля пользователя Samba через подключение Putty. При этом у меня есть файл содержащий соответствия IP адресов и логинов пользователей (у меня система такая: один компьютер – один пользователь).

[bash]
cat ‘/home/tvs/scripting/15.txt’ | while read LINE ; do awk “/^$LINE\ /{print \$2}” ‘/home/tvs/scripting/userip.txt’; done
[/bash]
разберем этот скрипт:

cat ‘/home/tvs/scripting/15.txt’ – вывести содержимое файла 15.txt

while read LINE ;    # в конвеере на вход команды BASH чтения строк из конвеера:

do # начало действий цикла BASH

awk “/^$LINE\ /{print \$2}” ‘/home/tvs/scripting/userip.txt’;

done # конец действий цикла BASH

/^ – ^ это спецсимвол, поэтому он экранируется с помощью символа /

$LINE – переменная куда была считана строка с помощью while read LINE (строка из файла /home/tvs/scripting/15.txt)

/{print \$2}” – вывод значения 2го столбца файла /home/tvs/scripting/userip.txt

/{ – экранирование спецсимвола {, чтобы сказать что это относится к AWK, а не BASH

\$2} – экранирование спецсимвола $2 (переменной AWK, содержащей значение 2го столбца (или другими словами 2е значение текущей в строке

например в файле с содержимым: 127.0.0.1     localhost

выведет localhost 

)

{} – в AWK действие, которое должно быть выполнено при нахождении нужного значения записывается в таких скобках, чтобы BASH не спутал их со своими вложенными запусками дочерних процессов в консоли эти скобки экранированны символами \

 

Таким образом этот файл выведет:

значение 2го столбца в файле /home/tvs/scripting/userip.txt, найденное в результате получения из файла /home/tvs/scripting/15.txt строки, содержащей IP адрес.

Причем, в файле /home/tvs/scripting/userip.txt будет найдена строка, совпадающая со значением IP адреса из  файла /home/tvs/scripting/15.txt

 

+ Нет комментариев

Добавить свой