Выполнить:
avahi-resolve -a <IP> | cut -f 2
Это вернет список имен хостов (по одному на -строку ), зарегистрированных в mDNS для IP-адреса, который вы передали. Если вы передадите свой собственный локальный IP-адрес, он вернет то, что вы зарегистрировали. При нормальных обстоятельствах он должен возвращать ровно одну строку с вашим локальным именем хоста (или любым дополнительным именем хоста, если были коллизии ).
Если вы удалите команду cut
в конце, вы можете просто самостоятельно проанализировать строки в своем собственном коде, разделив первый символ табуляции и взяв вторую часть каждой строки.
Кроме того, может быть какой-то вызов, который вы можете сделать на DBus, чтобы получить эту информацию, но если и есть, то я не нашел никакой информации об этом.
Чтобы упростить решение, а также из-за того, что ваши строки заголовка не согласованы (новая строка во входном файле и неправильный разделитель ~
в выходном файле ), давайте предположим, что ваш входной файл не содержит строки заголовка.
Можно решить задачу в два шага:
Создайте файл checksums.csv
, нам нужен только путь к файлу:
awk -F'~' '{ system("cksum /opt/xyz"substr($2,8)) }' file.csv > checksums.csv
substr($2,8)
удаляет префикс store:/
, а /opt/xyz
добавляется для завершения пути. Команда system(…)
выполняет команду cksum
по заданному пути, и вывод перенаправляется в выходной файл.
Пример вывода будет выглядеть так:
$ cat checksums.csv
128361894 41 /opt/xyz/2018/7/20/11/35/3f176f4b-41a0-4ac4-a795-a2240ffbb7b9.bin
820470222 41 /opt/xyz/2018/7/20/11/35/4302b390-1134-424d-a92f-ad27b233e8c1.bin
1593587341 41 /opt/xyz/2018/7/20/11/35/5ff59679-b3ec-46d2-aa7d-5ec28eff6fe9.bin
Поскольку выходные данные содержат контрольную сумму трех столбцов, количество байтов и путь, нам нужно извлечь столбцы три и один на следующем шаге.
Напечатайте строку заголовка и объедините столбец 1 (имя файла )из file.csv
с столбцом 3 (путь )и столбец 1 (контрольная сумма )из checksums.csv
.
{ echo "filename contenturl checksum";\
paste -d ' ' <(awk -F'~' '{ print $1 }' file.csv) <(awk '{ print $3,$1 }' checksums.csv);\
} > newfile.csv
Пример вывода:
$ cat newfile.csv
filename contenturl checksum
000224.pdf /opt/xyz/2018/7/20/11/35/3f176f4b-41a0-4ac4-a795-a2240ffbb7b9.bin 128361894
000238.pdf /opt/xyz/2018/7/20/11/35/4302b390-1134-424d-a92f-ad27b233e8c1.bin 820470222
000262.pdf /opt/xyz/2018/7/20/11/35/5ff59679-b3ec-46d2-aa7d-5ec28eff6fe9.bin 1593587341
Затем очистить:
rm checksums.csv
GNU sed
имеет флаг e
для команды s
, позволяющий вам интегрировать обработку оболочки, такую как cksum
, в ваш скрипт:
sed -E 'h;s_.*~store:/([^~]*).*_cksum /opt/xyz\1_e;x;G;s_~[^~]*(.*)\n(.*).* (.*)_~\2~\3\1_;s/~/ /g'
-E
переключает на расширенные регулярные выражения для лучшей читабельности h
сохраняет текущую строку в резервной области, поэтому мы можем ее испортить s_.*~store:/([^~]*).*_cksum /opt/xyz\1_e
соответствует всему, включаяstore:/
(для удаления ), имя файла внутри ()
для повторного использования как \1
и остальную часть строки (для удаления )и заменяет ее на cksum
+ путь. Теперь флаг e
вступает в действие, чтобы выполнить эту команду и заменить пространство шаблонов тем, что возвращается x;G
меняет местами удержание и пространство шаблонов, а затем добавляет удержание к пространству шаблонов, поэтому буфер содержитs_~[^~]*(.*)\n(.*).* (.*)_~\2~\3\1_
может потребоваться для чтения, но легко записать:~[^~]*
— это второе поле, (.*)\n
остальная часть исходной строки и (.*).* (.*)
три поля, возвращаемые cksum
, поэтому второе поле получает заменяется именем файла и контрольной суммой ~
в качестве разделителя, а два пробела:s/~/ /g