Команда AWK не соединяет два выхода нормально

#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 в первом условии, чтобы избежать печати этих строк. Рефакторинг для чтения двух отдельных дескрипторов файлов также делает сценарий несколько более идиоматичным и, надеюсь, понятным.