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
+ There are no comments
Add yours