bash - Разделить «табличные» значения на строки в массиве

Вы можете использовать

du --inodes * |sort -nr 

du --inodes * даст количество файлов по каталогам, а sort -nr отсортирует это число в порядке убывания

2
07.01.2017, 02:25
2 ответа

Судя по вашему (небольшому) образцу сообщений smartctl выше, их части в основном разделены "<пробел> <чем угодно, кроме строчной буквы>" ( кроме поля "# nnn" в самом начале строки).

sed может помочь разделить части:

$ smartctl_output="\                                           
# 1 Short offline Completed without error 00% 7264 -
# 2 Short offline Completed without error 00% 7240 -
# 1 Short offline Completed: read failure 20% 717 555027747"

$ csv="$( sed 's/ //; s/ \([^[:lower:]]\)/,\1/g' <<< "$smartctl_output" )"

$ echo "$csv"
#1,Short offline,Completed without error,00%,7264,-
#2,Short offline,Completed without error,00%,7240,-
#1,Short offline,Completed: read failure,20%,717,555027747

Если это то, что вы хотите, теперь вы можете заполнить свой массив, как вы это делали с HDDinfo.

[update]

Вот объяснение части sed , которая выполняет разбиение: программа sed состоит из двух частей, которые я поместил в одну линию. Вот расширенная версия:

sed '
    s/ //
    s/ \([^[:lower:]]\)/,\1/g
'

Программа sed работает с каждой строкой ввода: она считывает одну строку, применяет набор преобразований и печатает строку.Затем он начинается со следующей строки до тех пор, пока больше не останется строк для чтения.

Здесь первая sed команда s / // удаляет первый пробел, объединяющий «#» и следующее число.

Затем вторая команда sed s / \ ([^ [: lower:]] \) /, \ 1 / g выполняет поиск в начале каждого поля (как определено на "<пробел> <все, кроме строчных букв>") и заменяет пробел двоеточием. \ 1 относится к регулярному выражению в круглых скобках « \ ([^ [: lower:]] \) », которое представляет первый символ следующего поля.

Оставшаяся часть представляет собой тест: вместо того, чтобы передать sed содержимое файла или вывод команды, я передал ему переменную smartctl_output (строка, сделанная ваших образцов), и я присвоил результат переменной csv .

[обновление №2]

Теперь кажется, что поля разделены двумя или более пробелами. Это даже проще, чем раньше. Команда sed преобразуется в:

sed 's/  \+/,/g'

Что означает: заменить все серии из двух или более пробелов двоеточием.

4
27.01.2020, 22:03

Я не могу придумать способ сделать это изначально в оболочке, но в perl , например, вы могли бы определить регулярное выражение для разделения полей, и используйте его, чтобы вставить один разделитель по вашему выбору, который затем можно было бы просто прочитать, используя IFS =, или что-то еще.

Согласно вашему образцу, поля могут быть разделены пробелом, за которым следует:

  1. символ верхнего регистра или дефис; или
  2. последовательность, состоящая как минимум из двух цифр

Итак, передайте вашу команду примерно так:

. . . | 
  perl -F'[[:space:]](?=[[:upper:]-]|[[:digit:]]{2,})' -anle 'print join ",", @F'
0
27.01.2020, 22:03

Теги

Похожие вопросы