Использование grep … | awk … | awk …
не обязательно; один awk
может сделать всю работу. Так может sed
, и это может быть даже проще. Я хотел бы иметь дело с интервалом, используя:
x=$(df … | sed …); echo $x
Команда tr
после исправления заменяет символы новой строки пробелами, поэтому подсказка следует без новой строки перед ней. Предложение ; echo
добавляет пропущенную новую строку; предложение echo $x
(примечание без двойных кавычек) тоже подходит.
Что касается команды sed
:
sed -n '/File/!{ s/[[:space:]].*//; s%^.*/dev/%%p; }'
- По умолчанию ничего не печатать
- Если строка не совпадает
File
(выполняет работу grep -v
): - удалить первый пробел (пустой или табуляцию) и все после него (выполнить работу
awk '{print $1}'
) ) - заменить все до
/dev/
ничем и вывести на печать (выполняя работу awk -F/dev/ '{$0=$2}'
)
- Подстановка и захват команды, затем
echo
, имеет дело с пробелами и символами новой строки.
Итак, мое предлагаемое решение:
x=$(df -gP /data1 /data2 | sed -n '/File/!{ s/[[:space:]].*//; s%^.*/dev/%%p; }'); echo $x
Вы можете добавить unset x
после echo
, если вы собираетесь использовать это прямо в оболочке, а не в сценарии оболочки. Если он будет инкапсулирован в сценарий оболочки, вам не нужно об этом беспокоиться.
Я беспечно предполагаю, что вывод df -gP
не будет содержать такой путь, как этот, с двумя /dev
:
/who/knows/dev/lv_data01/dev/bin
Если это реальная проблема, вы можете исправить скрипт sed
, но я не думаю, что это будет. Одно дело, что второй awk
скрипт в вопросе обрабатывает по-другому.