сценарий bash, который сохраняет каждую строку вывода команды

sed -ne '/FOO/{x;P;x};/FOO/,/^$/p' testfile

Каждый блок не -пустых строк в выходных данных представляет собой один фрагмент совпадающих данных из входных данных. Количество новых строк варьируется.

Это

  1. подавляет вывод(-n);тогда
  2. печатает пустую строку перед каждым вхождением "FOO"(/FOO/{x;P;x}-использует пустое место хранения );
  3. выбирает диапазоны строк, начиная с тех, которые содержат FOO(/FOO/)и заканчивая пустыми строками(/^$/); и, наконец,
  4. печатает эти строки(p).

this line contains FOO
this line is not blank


This line also contains FOO


This line contains FOO too
Not blank
Also not blank


FOO!
Yet more random text

FOO!
0
06.07.2020, 05:42
3 ответа

Перенаправить файл напрямую наwhile... done:

mount | grep ^\/dev/ > tempoary
while IFS= read -r line
do
...
done < temporary

или используйте замену процесса, чтобы исключить временный файл:

while IFS= read -r line
do
...
done < <(mount | grep ^\/dev/)

или аналогичный переход к while

mount | grep ^\/dev/ |
while IFS= read -r line
do
...
done
1
18.03.2021, 23:21

Добавление IFS перед циклом for и заключение переменной файла в кавычки делают все нормально... Проверьте это:

#!/bin/bash
mount | grep ^\/dev/ > tempoary
input=$(cat tempoary)
x=0
while IFS= read -r line
do
  x=$((x+1))
  echo "$line" > /tmp/tmp/$x
  IFS=
  for file in $(echo "$line"); do
  eval "var$x='$file'";
  echo "$file"
  done
done <<< "$input"
0
18.03.2021, 23:21

На основании комментария

the outputs are "/dev/mapper/rhel-root on / type xfs (rw,relatime,seclabel,attr2,inode64,noquota)" and "/dev/sda1 on /boot type xfs (rw,relatime,seclabel,attr2,inode64,noquota)" respectively. After saving these 2 lines into variable1 and variable2

Стандартные переменные не всегда являются лучшим ответом. Вместо этого массив , скорее всего, будет тем, что вам нужно.

Например:

#!/bin/bash

typeset -A mounts

let index=0

m=$(mount | grep "^/dev/")

while read line
do
  mounts[$index]="$line"
  let index=index+1
done <<< "$m"

echo There were $index lines
let a=0
while [ $a -lt $index ]
do
  echo Line $a was ${mounts[$a]}
  let a=a+1
done

На моей машине, если я запущу это, я получу

There were 4 lines
Line 0 was /dev/vda3 on / type ext4 (rw,relatime,data=ordered)
Line 1 was /dev/vda1 on /boot type ext4 (rw,relatime,data=ordered)
Line 2 was /dev/vdb on /news type ext3 (rw,relatime,data=ordered)
Line 3 was /dev/vdc1 on /brick type ext3 (rw,relatime,data=ordered)
0
18.03.2021, 23:21

Теги

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