запутался в сценариях awk

Как прокомментировал @steeldriver, текст перед запросом на вход хранится в файле /etc/issueи печатается сразу после вызова agetty.

/usr/bin/agettyотвечает за создание tty при запуске.

Мы можем просмотреть дерево systemd с помощью

systemctl status

В Arch файлы для systemd agetty хранятся по адресу /etc/systemd/getty.target.wants/getty1.service.

0
02.11.2021, 14:26
3 ответа

В awk-скрипте содержимое — это то, что вы предоставляете awkв виде команд. Так что в данном случае это:

/./ {
##comment print the name and grade, which is first two fields
print $1" "$2

}

Однако это затруднит использование -F,, поэтому вместо этого установите FSв блоке BEGIN.

Таким образом, ваш сценарий будет:

#!/usr/bin/awk -f
##comment create an awk script that will accept the following file and output the name and grade fields
##comment specify the delimiter as ","
BEGIN { FS = "," }

/./ {
##comment print the name and grade, which is first two fields
print $1" "$2

}
3
02.11.2021, 14:57

Вы написали awkскрипт, но поместили его в скрипт. Это ваш awkскрипт:

/./ {
##comment print the name and grade, which is first two fields
print $1" "$2
}

Сохраните его в файл script.awkи запустите как

awk -F',' -f script.awk inputfile

Теперь несколько советов по вашему сценарию:

Команды

awkвыглядят как CONDITION {COMMAND(S)}. Если CONDITIONвыполняется для строки (, то выполняется/выполняется запись ), {COMMAND(S)}. Если нет CONDITION, {COMMAND(S)}выполняется/выполняются для всех записей, если нет/нет {COMMAND(S)}, то запись просто печатается всякий раз, когда встречается CONDITION.

В вашем случае:

  1. /./это регулярное выражение, которое сопоставляет строки с любым символом... так что все строки, кроме пустых -в значительной степени избыточны, как условие

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

  3. Вам нужно будет использовать ,в качестве разделителя в скрипте в начальном блоке BEGIN-.


BEGIN {FS=","}
{print $1,$2}

Если вы также хотите использовать запятую в качестве разделителя вывода, используйте:

BEGIN {FS=OFS=","}
{print $1,$2}
1
02.11.2021, 15:02

Сценарий awk — это просто набор awk-команд, которые могут быть запущены с помощью awk. Существует два способа написания awk-скрипта:

  1. Просто напишите awk-команды в текстовом файле и вызовите с помощью awk -f /path/to/file.awk. В вашем случае это будет:

    /./ {
    ##comment print the name and grade, which is first two fields
    print $1" "$2
    
    }
    

    И вы бы запустили его как:

    awk -F, -f /path/to/file.awk inputFile
    

    Или, если вам нужно, чтобы он запускался только с awk -f./path/to/file.awk inputFile, без -F,, то установите разделитель полей в самом скрипте:

    BEGIN{ FS=","}
     /./ {
    ##comment print the name and grade, which is first two fields
    print $1" "$2
    
    }
    

    А затем запустить с помощью awk -f /path/to/file.awk inputFile.

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

    #!/usr/bin/awk -f
    
    ## With this approach, you can't use -F so you need to set
    ## the field separator in a BEGIN{} block.
    BEGIN{ FS=","}
    /./ {
    ##comment print the name and grade, which is first two fields
    print $1" "$2
    
    }
    

    Затем вы должны сделать скрипт исполняемым(chmod a+x /path/to/file.awk)и запускать его следующим образом:

    /path/to/file.awk inputFile
    
    

Это оба сценария awk. Третий вариант — вместо этого написать сценарий оболочки и заставить сценарий оболочки запускать awk. Это будет выглядеть так:

#!/bin/sh

awk -F, '

/./ {
##comment print the name and grade, which is first two fields
print $1" "$2

}' "$1"

То, что у вас было, было ни тем, ни другим :вы использовали awk shebang, но вместо awk-скрипта у вас был сценарий оболочки.

0
02.11.2021, 15:48

Теги

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