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
Возможно, ваш /etc/fstab
указывает некоторые монтирования с помощью UUID=
или LABEL=
(, что приводит к тому, что mount
перебирает все найденные блочные устройства ), и у вас есть некоторые мусорные файлы, такие как /dev/sdf
и /dev/sdg
, которые не являются фактическими узлами устройства?
Выполнить ls -l /dev/sdf /dev/sdg
. Если он что-то отображает, и буква в самом первом столбце строки разрешений не b
, это не настоящие блочные устройства. Они могли быть созданы случайно введенной командой с ошибкой или двумя ранее.