#awk #sed
#awk #sed
Вопрос:
У меня есть простая задача объединить вывод из lsblk
команды с выводом из df
команды в поле, которое содержит точку монтирования.
Пример вывода из df
:
$ df -P --exclude={tmpfs,devtmpfs,squashfs,overlay} | sed /^Filesystem/d
/dev/mapper/dockerVG-rootLV 51339744 8118908 40583220 17% /
/dev/mapper/ssdVG-ssdLV 515006720 214044372 274731772 44% /dockerssd
/dev/mapper/hddVG-hddLV 1547129060 83285716 1385183760 6% /dockerhdd
/dev/mapper/hddVG-dockerLV 515006720 76061148 412714996 16% /var/lib/docker
Вывод lsblk
:
$ lsblk -n -b --output KNAME,NAME,SIZE,MOUNTPOINT | egrep -v "fd0|ram|loop|sr0|hdc|cdrom|[SWAP]"
sda sda 53687091200
sda1 └─sda1 53684994048
dm-3 └─dockerVG-rootLV 53682896896 /
sdb sdb 2147483648000
sdb1 └─sdb1 2147482599424
dm-1 ├─hddVG-dockerLV 536866717696 /var/lib/docker
dm-2 └─hddVG-hddLV 1610612736000 /dockerhdd
sdc sdc 536870912000
sdc1 └─sdc1 536869863424
dm-0 └─ssdVG-ssdLV 536866717696 /dockerssd
Я использую Awk; вот мой текущий код:
awk '{ print $1 " " $3 " " $4 " " arr[$4] }
/^// { arr[$6]=$1 " " $2 " " $3 " " $4 " " $5 }' <<< $(
df -P --exclude={tmpfs,devtmpfs,squashfs,overlay} |
sed -e /^Filesystem/d
lsblk -n -b --output KNAME,NAME,SIZE,MOUNTPOINT |
egrep -v "fd0|ram|loop|sr0|hdc|cdrom|[SWAP]")
Вот результат, который я получаю в настоящее время:
/dev/mapper/dockerVG-rootLV 8118908 40583220
/dev/mapper/ssdVG-ssdLV 214044380 274731764
/dev/mapper/hddVG-hddLV 83285716 1385183760
/dev/mapper/hddVG-dockerLV 76061152 412714992
sda 53687091200
sda1 53684994048
dm-3 53682896896 / /dev/mapper/dockerVG-rootLV 51339744 8118908 40583220 17%
sdb 2147483648000
sdb1 2147482599424
dm-1 536866717696 /var/lib/docker /dev/mapper/hddVG-dockerLV 515006720 76061152 412714992 16%
dm-2 1610612736000 /dockerhdd /dev/mapper/hddVG-hddLV 1547129060 83285716 1385183760 6%
sdc 536870912000
sdc1 536869863424
dm-0 536866717696 /dockerssd /dev/mapper/ssdVG-ssdLV 515006720 214044380 274731764 44%
Мне не нужна эта часть вывода:
/dev/mapper/dockerVG-rootLV 8118908 40583220
/dev/mapper/ssdVG-ssdLV 214044380 274731764
/dev/mapper/hddVG-hddLV 83285716 1385183760
/dev/mapper/hddVG-dockerLV 76061152 412714992
Для меня достаточно иметь:
sda 53687091200
sda1 53684994048
dm-3 53682896896 / /dev/mapper/dockerVG-rootLV 51339744 8118908 40583220 17%
sdb 2147483648000
sdb1 2147482599424
dm-1 536866717696 /var/lib/docker /dev/mapper/hddVG-dockerLV 515006720 76061152 412714992 16%
dm-2 1610612736000 /dockerhdd /dev/mapper/hddVG-hddLV 1547129060 83285716 1385183760 6%
sdc 536870912000
sdc1 536869863424
dm-0 536866717696 /dockerssd /dev/mapper/ssdVG-ssdLV 515006720 214044380 274731764 44%
Не могли бы вы мне помочь, пожалуйста, как разделить этот вывод? Может быть, какое-то исправление в моей команде Awk?
Комментарии:
1. Кроме того, регулярное
[SWAP]
выражение соответствует всему, что содержит символ S, W, A или P в верхнем регистре.2.
this <<<$(that)
это просто действительно странный способ записиthat | this
с некоторыми любопытными угловыми случаями, которые вы, вероятно, не хотите отлаживать.
Ответ №1:
Ваш синтаксис довольно странный. Вероятно, рефакторинг в соответствии с
awk 'NR == FNR {
if ($1 ~ /^//) arr[$6]=$1 " " $2 " " $3 " " $4 " " $5
next }
/fd0|ram|loop|sr0|hdc|cdrom|[SWAP]/ { next }
{ print $1 " " $3 " " $4 " " arr[$4] }'
<(df -P --exclude={tmpfs,devtmpfs,squashfs,overlay})
<(lsblk -n -b --output KNAME,NAME,SIZE,MOUNTPOINT)
Filesystem
не соответствует ^/
, поэтому я убрал это. Регулярное выражение [SWAP]
было неверным; Я предполагаю, что вы хотели соответствовать этому буквально. Awk может делать все egrep
и sed
может делать, поэтому я их переработал.
Суть здесь next
в первом условии, чтобы избежать печати этих строк. Рефакторинг для чтения двух отдельных дескрипторов файлов также делает сценарий несколько более идиоматичным и, надеюсь, понятным.