Объединить вывод двух команд в одну таблицу с помощью сценария оболочки - PullRequest
5 голосов
/ 02 ноября 2011

Я хочу отобразить вывод следующих команд, как показано ниже:

1)

mount | grep -i "/dev/sd*" | awk '{ print NR "\t" $1 "\t" $3 }'

2)

/usr/sbin/smartctl -a /dev/sdb | grep Device: | awk '{print $2 }'

1-я команда отображает 3 столбца с несколькими строками, а следующая команда отображает один столбец информации.

Я хочу объединить выходные данные обеих команд и concat и отобразить их в виде 4 столбцов с несколькими строками. Пожалуйста, предложите.

Ответы [ 3 ]

5 голосов
/ 02 ноября 2011

Это то, для чего paste.Используйте подстановка процесса , чтобы оболочка обрабатывала ваши команды как файлы:

paste <(mount | awk 'tolower($0) ~ /\/dev\/sd*/ {print NR "\t" $1 "\t" $3}') \
      <(/usr/sbin/smartctl -a /dev/sdb | awk '/Device:/ {print $2}')

Я удалил команды grep, что легко может сделать awk.

3 голосов
/ 02 ноября 2011

Сделать именованный канал для хранения вывода первой команды:

mkfifo mount_output
mount | grep -i "/dev/sd.*" | awk '{ print NR "\t" $1 "\t" $3 }' > mount_output &

Затем используйте paste:

/usr/sbin/smartctl -a /dev/sdb | grep Device: | awk '{print $2 }' | paste foo -

Обратите внимание, что awk '{print $2 }' можно упростить до cut -d' ' -f2. Создание временного именованного канала правильнее сделать с помощью

tempd=`mktemp -d`
mkfifo ${tempd}/mount_output

затем rm -rf "$tempd", когда труба больше не нужна.

2 голосов
/ 02 ноября 2011

Некоторые мысли:

Если у вас уже есть awk в командной строке, вам не нужен grep.Таким образом, вы можете сделать это:

mount | awk '/\/dev\/sd/ {print NR, $1, $3}'
smartctl -a /dev/sdb | awk '/Device:/ {print $2}'

Если вы хотите создать одну строку вывода для каждого устройства, вы можете направить вывод вашей первой командной строки в цикл, а затем запустить smartctl внутри цикла,например:

mount | awk '/\/dev\/sd/ {print NR, $1, $3}' | while read nr dev mntpt; do
  echo -e "$nr\t$dev\t$mntpt\t$(smartctl -a $dev | awk '/Device:/ {print $2}')"
done

Флаг -e для эха необходим, чтобы он распознал \t как символ табуляции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...