awk Против. grep против ?? и лучшие практики для сигнальных строк файла, которые нужно извлечь

У меня точно такая же проблема. wpa _Заявитель больше не подключается к eduroam

Мы должны попытаться выяснить, какое обновление пакета вызвало эту ошибку, и либо вернуть предыдущую версию, либо исправить ее.

Обновление :Я обнаружил, что 25 ноября libssl был обновлен в debian testing/unstable до версии 1.1.1a -1. Вместо этого wpasupplicant не обновлялся с августа.

Я попытался понизить версию обоих, и на самом деле проблемным оказался wpasupplicant. Попробуйте установить более старую версию по:

sudo apt-get install wpasupplicant=2:2.4-1+deb9u2

, затем отметьте его нажатием:

sudo apt-mark hold wpasupplicant

2
08.12.2020, 17:35
2 ответа
awk 'function prnt(type, pr){ print pr >"concatenated_"type".txt"; };
     FNR==1{ type="load";
             if (!path) {
                 path=FILENAME; sub("[^/]+$","",path);
                 prnt(type, "push(\"<"path">\")$");
              };
              prnt(type,"\tload(\"<"FILENAME">\")$");
           };
     /START HEADER/{ prn=1; type="header"; next; };
     /START SCRIPT/{ prn=1; type="script"; next; };
     /END SCRIPT/ || /END HEADER/{ prn=0; };
prn{ prnt(type, $0); }' /home/User/Unix/*.mac

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

function prnt(type, pr){ print pr >"concatenated_"type".txt"; }

Значение параметра typeизменяется условно; если это первая строка ввода FNR==1, мы устанавливаем type="load"для записи имени и пути к файлам, но путь следует записывать только один раз, поэтому мы использовали if(!path) { path=FILENAME;...; }, чтобы убедиться, что он запишет один раз (в следующий раз переменная pathуже принимает значение, поэтому блок внутри оператора if не будет выполняться для части пути снова ). для остальных входных данных мы будем писать только имя файла, и это также делается один раз для каждого файла, когда FNR==1.

если строка содержит /START HEADER/, мы устанавливаем type="header"и, соответственно, мы устанавливаем type="script", когда она соответствует строке с /START SCRIPT/; мы также использовали флаг управляющей переменной prn=1, чтобы контролировать, когда вызывать нашу функцию для печати строк в выделенное имя файла с помощью prn{ prnt(type, $0); }.

Команда

nextиспользуется, чтобы начать сначала и прочитать следующую строку ввода,поэтому он не будет выполнять следующие команды и не будет записывать заголовок -начало -строку строки в выводе.

также мы сбрасываем флаг prn=0, чтобы избежать печати заголовка -конца -строки строки.

3
18.03.2021, 22:44
$ cat tst.awk
BEGIN {
    out["HEADER"] = "Concatenated_Header.txt"
    out["SCRIPT"] = "Concatenated_Script.txt"
    out["LOAD"]   = "Concatenated_Load_Commands.txt"
}

FNR == 1 {
    if ( NR == 1 ) {
        dir = FILENAME
        sub("/[^/]+$","",dir)
        printf "push(\"%s\")$\n", dir > out["LOAD"]
    }
    printf "   load(\"%s\")$\n", FILENAME > out["LOAD"]
}

block {
    if ( index($0,"/* END ") == 1 ) {
        block=""
    }
    if ( block in out ) {
        print > out[block]
    }
    next
}

index($0,"/* START ") == 1 { block=$3; next }

$ awk -f tst.awk $PWD/*.mac

$ head Concat*
==> Concatenated_Header.txt <==
 Header 1 Content
 Header 2 Content

==> Concatenated_Load_Commands.txt <==
push("/home/foo/tmp")$
   load("/home/foo/tmp/01_FileName.mac")$
   load("/home/foo/tmp/02_FileName.mac")$

==> Concatenated_Script.txt <==
    Script 1 Content
    Script 2 Content

Если вы хотите создать выходной файл и для комментариев, просто добавьте строку out["COMMENTS"] = "Concatenated_Comments.txt"в секцию BEGIN. То же самое для всего остального, для чего вы создаете блоки START... END. Обратите внимание, что скрипт ищет только /* STARTвне блоков и /* ENDвнутри них, оба только в начале строк, поэтому эти строки могут появляться внутри ваших блоков текста без нарушения скрипта.

1
18.03.2021, 22:44

Теги

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