awk-1-liner для суммирования чисел в stdin при печати количества вхождений определенного текста вместе с другим произвольным текстом - PullRequest
3 голосов
/ 30 июля 2010

Я определенно заинтересован в получении книги на awk. Я был выигран, несмотря на то, что играл с ним немного времени. Однако, в то же время, у меня есть проблема, которую я могу решить исключительно с помощью [g] awk. Для демонстрации я буду использовать вывод fdisk. В этом примере желаемый конечный результат будет выглядеть примерно так:

Disks: 2 [240 GB total]
sda=120 GB
sdb=120 GB

Вот что у меня есть:

fdisk -l 2>/dev/null | awk '/^Disk \/dev\/[vsh]d./ {bytes+=$5} END {print "Disks: "NR" ["; gb=bytes/1024/1024/1024; print gb" GB total]"}'

Во всяком случае, мой NR печатает 73 .. на моем ноутбуке с двумя жесткими дисками. Это я не понимаю. Пока хорошо .. Я, может быть, на полпути. Любые советы или краткие учебники будут с благодарностью!


После двух основных отличных ответов я получил следующее:

echo DISKS: $(fdisk -l 2>/dev/null | awk -F/ '/^Disk \/dev\/[vsh]d.|^Disk \/dev\/xvd./{print$3}' | awk '{d++;bytes+=$4;disk[$1]=$2" "$3}END{gb=bytes/1024/1024/1024; printf gb" GB total, "d" disks\n";for (i in disk) print "  "i,disk[i]}' | sed -e "s/,$/ /" -e "s/: / /")

, который дал мне вывод, как это:

DISKS: 78.3585 GB total, 2 disks
  sda 80.0 GB
  sdb 4110 MB

С нетерпением жду того дня, когда я смогу сделать это все в одной команде awk без sed. :) Но пока, спасибо, ребята!

Ответы [ 2 ]

2 голосов
/ 30 июля 2010
$ fdisk -l 2>/dev/null | awk '/^Disk \/dev\/[vsh]d./{d++;bytes+=$5;disk[$2]=$3$4} END {printf "Disks: "d" ["; gb=bytes/1024/1024/1024; printf gb" GB total]\n";for (i in disk) print i,disk[i]}'
Disks: 1 [93.1604 GB total]
/dev/sda: 100.0GB,
1 голос
/ 30 июля 2010

Ты более половины пути.Единственная проблема заключается в том, что NR - это количество строк (пока что), а не количество строк, соответствующих вашему выражению.Так что просто используйте другую переменную для этого.

fdisk -l 2>/dev/null | awk '/^Disk \/dev\/[vsh]d./ {bytes+=$5; disks+=1} END {print "Disks: "disks" ["; gb=bytes/1024/1024/1024; print gb" GB total]"}'

Это дает:

Disks: x [
yyy GB total]

Чтобы удалить перевод строки и добавить вывод для каждого диска, попробуйте:

fdisk -l 2>/dev/null | awk '/^Disk \/dev\/[vsh]d./ {cur_bytes=$5; bytes+=cur_bytes; disks+=1; gsub(/dev|:|\//, "", $2); print $2 "=" cur_bytes/1024/1024/1024 " GB";} END {printf "Disks: "disks" ["; gb=bytes/1024/1024/1024; print gb" GB total]"}'

Это даст:

sda=xx GB
sdb=yy GB
sdc=zz GB
Disks: 3 [ww GB total]

Заголовок не печатается первым.Вы можете использовать конкатенацию для этого.

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