Возможно ли объединить файлы сценариев bash и awk? - PullRequest
2 голосов
/ 18 декабря 2011

У меня есть некоторый bash-скрипт, где я получаю значения переменных, которые я хотел бы использовать в awk.Можно ли включить в bash целый файл awk (как это возможно с файлами сценариев bash), например:

#!/bin/sh
 var1=$1
source myawk.sh

и myawk.sh:

print $1;

Ответы [ 4 ]

4 голосов
/ 18 декабря 2011

Bash и awk - это разные языки, каждый из которых имеет своего переводчика с одинаковым именем. Крошечный образец, который вы показываете, урезан слишком далеко, чтобы иметь смысл:

  1. Вы пометили оба файла как сценарии оболочки; один использует шебанг #!/bin/sh, а другой - расширение .sh. Очевидно, что оболочка может читать сценарий оболочки, и команда для этого называется . в оболочке Bourne (или source в csh и bash).
  2. Сценарий оболочки назначает переменную, но вы ее нигде не используете. Вы имели в виду передать его сценарию awk?
  3. И сценарий awk, и сценарий оболочки используют $ 1, что для них имеет разное значение (в bash это из командной строки или команды set; в awk - из разобранной строки ввода).

Эти два инструмента часто используются в тандеме, поскольку оболочка лучше сочетает отдельные программы, а awk лучше форматирует табличный или структурированный текст. Это было так часто, что целый язык развивался, чтобы объединить задачи; Корни Perl - это сочетание shell, awk и sed.

Если вы просто хотели передать переменную из сценария оболочки в сценарий awk, используйте -v. Справочная страница - ваш друг.

2 голосов
/ 19 декабря 2011

Прежде всего, если вы пишете bash, не используйте #!/bin/sh, который переведет вас в режим совместимости, который необходим только в том случае, если вы пишете для переносимости (а затем вы должны придерживаться нормы POSIX).

Теперь по вашему вопросу вам просто нужно запустить awk из вашего bash-скрипта, например:

#!/bin/bash
var1=$1
awk -f myawk.sh

, также вы должны использовать .awk в качестве расширения, я думаю.

1 голос
/ 08 мая 2013

Как хардкорный пользователь AWK, я вскоре понял, что выполнение следующих действий действительно очень помогло:

  1. Определение и экспорт переменной AWK_REPO в моем bashrc
    #Content of bashrc
    export AWK_REPO=~/bin/AWK
  2. Хранение там каждого скрипта AWK, который я пишу с расширением .awk.
  3. Затем вы можете позвонить из любого места, например так:
    awk -f $AWK_REPO/myScript.awk $file
    или даже, используя Shebangs и добавляя AWK_REPO в PATH (с export PATH=${AWK_REPO}:${PATH})
    myScript.awk $file
1 голос
/ 19 декабря 2011

Или, многие люди делают что-то вроде этого:

#!/bin/env bash
#Bash things start
 ...
var1=$1
#Bash things stop
#Awk things start, 
#may use pipes or variable to interact with bash 
awk -v V1=var1 '
#AWK program, can even include awk scripts here.
'
#Bash things

Я предлагаю эту страницу здесь Брюсом Барнеттом:

http://www.grymoire.com/Unix/Awk.html#uh-3

Вы также можете использовать двойные кавычки, чтобы использовать функцию извлечения оболочки, но это сбивает с толку.

Лично я просто стараюсь избегать этих необычных добавлений gnu в bash или awk и делаю мои сценарии совместимыми с ksh + (n) awk.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...