Как удалить строку имени пользователя / имени хоста из вывода на Korn Shell? - PullRequest
0 голосов
/ 10 апреля 2020

Я запускаю команду

df -gP /data1 /data2 | grep -v File | awk '{print $1}' |
    awk -F/dev/ '$0=$2' | tr '\n' '

на оболочке AIX (k sh), и она печатает вывод ниже:

lv_data01 lv_data02 root@testhost:/

Однако я хотел бы, чтобы вывод печататься таким образом. Может ли кто-нибудь помочь?

lv_data01 lv_data02

1 Ответ

2 голосов
/ 15 апреля 2020

Использование 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 скрипт в вопросе обрабатывает по-другому.

...