доступ к переменным внешней оболочки внутри nawk в ksh - PullRequest
1 голос
/ 24 июня 2011

Я пытаюсь получить доступ к переменной оболочки внутри канала Nawk. Я никогда не делал этого раньше, и мне было интересно, если это возможно.

Вот команда sbdadm list-lu содержание:

Найдено 2 LU (s)

          GUID                    DATA SIZE           SOURCE

600144f029bf0a0000004e0484740052 107380964864 / dev / rdsk / c9d0s1 600144f029bf0a0000004e0484740053 53694562304 / dev / rdsk / c9d0s3

Вот мой пример моего сценария:

DISK=/dev/rdsk/c9d0s3
sbdadm list-lu |nawk '/$DISK/ {print}'

ПРИМЕЧАНИЕ : я знаю, что синтаксис "/$DISK/" не будет работать, так как $ является частью символа регулярного выражения. Мне нужен правильный синтаксис, если такой код когда-либо возможен.

Кроме того, awk порождает другую оболочку? Если да, то возможно ли экспортировать эту переменную $DISK в эту оболочку.

Ответы [ 3 ]

1 голос
/ 24 июня 2011

Проблема не в том, что $ является частью синтаксиса RE;это то, что / является разделителем RE.Если вы просто ищете c9d0s3, то использование правильного цитирования поможет:

$ DISK=c9d0s3
$ awk "/$DISK/ {print}" output
600144f029bf0a0000004e0484740053 53694562304 /dev/rdsk/c9d0s3

Объяснение: если вы используете "" вместо '', тогда переменная оболочки будет расширена до передачи программы на awk, поэтому awk будет видеть

/c9d0s3/ {print}

в качестве своей программы.Вы все еще можете искать шаблон с / в нем, но это требует некоторой магии цитирования оболочки:

$ DISK=/dev/rdsk/c9d0s3
$ awk "{if (match(\$0, \"$DISK\")) print}" output
600144f029bf0a0000004e0484740053 53694562304 /dev/rdsk/c9d0s3

И нет, awk не порождает подоболочку.С чего бы это?И зачем вам передавать переменную, если вы можете просто сделать это через среду?

1 голос
/ 24 июня 2011

В дополнение к ответу j.w.r , вы можете явно установить переменную awk со значением переменной оболочки:

 nawk -v disk="$DISK" '$3 == disk' output_file
1 голос
/ 24 июня 2011
export DISK=/dev/rdsk/c9d0s3
cat output | awk '$0 ~ ENVIRON["DISK"]{print}'

Результаты:

600144f029bf0a0000004e0484740053 53694562304 /dev/rdsk/c9d0s3

С вызовом system (после экспорта DISK):

echo | awk '{system("echo $DISK")}'

Результаты:

/dev/rdsk/c9d0s3

...