Я пытаюсь напечатать строки с совпадающими строками, но также хотел бы напечатать «NA» для других строк

Попробуйте далее:

sshpass -p $PASSWORD ssh -t user@host<<EOF
echo uname -a
cd /tmp/ || exit 1
echo $PASSWORD | sudo -S bash ./remote_exec.sh
exit $?

EOF
0
16.12.2016, 22:09
3 ответа

С GNU sed

sed -n '
    /Volume/!d
    :a
    n
    /lock mode/{
        p
        d
        }
    /^\s*$/!ba
    c\NA
    ' <file>

С awk

awk '
    BEGIN{
        FS="\n"
        RS="\n\n"
    }
    /lock mode/{
        for(i=1;i<=NF;i++)
            if($i ~ /lock mode/)
                print $i
        next
    }
    {
        print "NA"
    }
    ' <file>
2
28.01.2020, 02:13

С awk в режиме абзаца

awk -v RS= '{match($0, /lock mode=[^\n]+/); 
  print RSTART? substr($0, RSTART, RLENGTH): "NA"}' file

RS = заставляет каждый абзац обрабатываться как отдельная запись. Вызов match заполняет координаты режима блокировки = .... в предварительно определенные переменные RSTART и RLENGTH . Если RSTART не равно нулю, печатается подстрока, соответствующая RSTART и RLENGTH , в противном случае печатается NA

{{ 1}}
3
28.01.2020, 02:13

Это просто с perl :

perl -l -00 -ne 'print /lock mode.*/ ? $& : "NA"'
  • -l устанавливает разделитель выходного поля на новую строку
  • -00 : режим абзаца (записи - это абзацы)
  • -ne код : запускать код для каждой входной записи
  • , если запись содержит режим блокировки , за которым следует любое количество символов, отличных от новой строки , затем выведите совпадение ( $ & ) или NA в противном случае.

В основном то же, что и решение awk @iruvar , но в perl .

3
28.01.2020, 02:13

Теги

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