Как разобрать df построчно? - PullRequest
0 голосов
/ 07 мая 2018

Я хотел бы проанализировать вывод из df, поэтому я делаю

arr=( $(df -hPT | awk '{print $1, $2, $3, $5, $6, $7}') )
for f in ${arr[@]}; do echo ${f[*]};sleep 1;done

но я получаю

Filesystem
Size
Avail
Use%
Mounted
devtmpfs
7.8G
7.8G
0%
/dev
tmpfs
7.8G
7.7G
3%

где я надеялся на

Filesystem Size Avail Use% Mounted
devtmpfs 7.8G 7.8G 0%
/dev tmpfs 7.8G 7.7G 3%

Мой план состоял в том, что $f будет массивом для каждой строки, поэтому я могу манипулировать каждой строкой и printf выводом после.

Вопрос

Есть идеи, как получить массив вывода awk на строку df?

Ответы [ 4 ]

0 голосов
/ 08 мая 2018

Если вы установите IFS на \ n следующим образом:

IFS=$'\n' arr=( $(df -hPT | \
  awk '{print $1, $2, $3, $5, $6, $7}') )
for f in ${arr[@]}; do
  echo ${f[*]}
done
echo "nb elt in arr = ${#arr[@]}"
0 голосов
/ 07 мая 2018

Решение 1-е: В одном цикле while:

df -hPT | while read first second third fourth fifth sixth seventh
do
   echo $first $second $third $fifth $sixth $seventh
   sleep 1
done

Решение 2-е: Следующий сингл awk может помочь вам в этом.

df -hPT | awk '{print $1, $2, $3, $5, $6, $7;system("sleep 1")}'
0 голосов
/ 07 мая 2018

Вы можете использовать встроенную команду bash lines для сохранения строк файла / потока в массиве:

mapfile -t lines < <(df -hPT | awk '{print $1, $2, $3, $5, $6, $7}')
for line in "${lines[@]}"; do
    manipulate "$line"
done

Необходимо перенаправить из процесса подстановки , чтобы мы не вводили никаких подоболочек.

Вы видели, что происходит, когда вам не удается заключить в кавычки переменную в цикле for: всегда заключать в кавычки ваши переменные (если вы точно не знаете, почему нет).

0 голосов
/ 07 мая 2018

Использовать при чтении ... loop

df -hPT | while read line ; do echo "$line" | awk '{print $1, $2, $3, $5, $6, $7}' ;sleep 1 ; done
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...