LINUX.ORG.RU

bash+awk, не получается правильно написать строку на awk в bash скрипте

 ,


1

2

Пишу скрипт для работы со стримером и нужно поймать значение File number=2 (именно «2») из вывода команды «mt -f /dev/nst0 status»
Выглядит он так:

SCSI 2 tape drive:
File number=2, block number=0, partition=0.
Tape block size 512 bytes. Density code 0x42 (LTO-2).
Soft error count since last status=0
General status bits on (81010000):
EOF ONLINE IM_REP_EN

Решил сделать это через awk
команда:
mt -f /dev/nst0 status | awk -F "," '{if (NR==2) {if (NF=1) { print }}}'
выводит «File number=2» и, по идее, нужно сделать:
mt -f /dev/nst0 status | awk -F "," '{if (NR==2) {if (NF=1) /[0-9]/ { print }}}'
чтобы отсеять значение File number. Но awk при этом ругается на «{» перед «print» (parse error)

И еще вопросы.
Вроде можно перечислить все условия через &&
Например:
mt -f /dev/nst0 status | awk -F "," '{if (NR==2) && (NF=1) && (/[0-9]/) { print }}'
Но тут выскакивает ошибка на первое же упоминание &&
Почему?

awk нормально воспринимает (NR==2), но выводит пустоту на (NF==1), обрабатывая строку так как нужно только с (NF=1). И наоборот. Это я никак не могу понять.

Ну и, может есть другие решения данной задачи?

P.S. Знаю, что можно отсеять через grep или любым другим способом, передав вывод первой команды дальше через конвейер (|), но интереснее же обойтись одним вызовом :)

echo File number=2, block number=0, partition=0 | cut -f1 -d, | cut -f2 -d=

Это в лоб, выбирать строку grep`ом.

grep -i 'File number'

kostik87 ★★★★★ ()
Ответ на: комментарий от zolden

Мне нужно присвоить переменной значение File number, в данном примере это 2.

mt -f /dev/nst0 status | awk -F "," '{if (NR==2) {if (NF=1) { print }}}' | cut -f1 -d, | cut -f2 -d=
с этой задачей справляется. Большое спасибо за пример.

Я пытался найти способ сделать это одним вызовом grep, awk или sed. Но, видимо так не получится.
Жаль :(

sick_monkey ()
Ответ на: комментарий от outsider

Да, так намного проще, спасибо! Не знал, что параметр -F можно передавать без кавычек! )

sick_monkey ()
Ответ на: комментарий от outsider

Ок, но я же не знаю, чему будет равен File number. Может 10, а модет и 100... Касета размером в 4 Тб и записать туда можно ооочень много ))

Поэтому я пытался взять File number=2 и отсеять только цифры.

sick_monkey ()
$ echo  "File number=2, block number=0, partition=0.
Tape block size 512 bytes. Density code 0x42 (LTO-2).
Soft error count since last status=0
General status bits on (81010000):
EOF ONLINE IM_REP_EN" | grep -qoE '^File number=2' && echo "found"
found
$ echo  "File number=2, block number=0, partition=0.
Tape block size 512 bytes. Density code 0x42 (LTO-2).
Soft error count since last status=0
General status bits on (81010000):
EOF ONLINE IM_REP_EN" | grep -qoE '^File number=3' && echo "found"

gawk здесь не нужна.

drBatty ★★ ()
Ответ на: комментарий от sick_monkey

не.

$ echo  "File number=2, block number=0, partition=0.
Tape block size 512 bytes. Density code 0x42 (LTO-2).
Soft error count since last status=0
General status bits on (81010000):
EOF ONLINE IM_REP_EN" | sed -rn 's/^File number=([0-9]+).*/\1/p'
2
drBatty ★★ ()
Ответ на: комментарий от sick_monkey

я же написал что это хак)) просто авк пытается вычесть 0 из $2 и получается что из первого встречного числа, если там ничего не будет, то выведет 0

outsider ★★ ()
Ответ на: комментарий от sick_monkey

Но его я знаю еще меньше чем awk и там я далеко не продвинулся.

именно эта задача ИМХО больше для sed, во всяком случае, на sed оно решается просто и без хаков.

drBatty ★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.