Как найти числа из файла журнала, соответствующие шаблону

Я не знаком с spacecmd, но вы можете использовать модуль wait_forдля мониторинга PID.

Из документов:

- name: Wait until the process is finished and PID was destroyed
  wait_for:
    path: /proc/3466/status
    state: absent
2
04.10.2021, 05:41
3 ответа

Я предлагаю другое решение с комбинацией sedиgrep:

$ grep '^Running\|Initial' screen2.dat | sed -e 'N;s/\n\|,/ /g' -e 's/[^0-9. ]\+\|^[^0-9]\+//g'
0       7.338690864048985 28.51815509409351 11.795143979909135
1       10.599326804010953 7.514871863851674 14.843070346933654
  • grepизвлечет только те строки, которые начинаются с «Выполняется» и «Начальный».

     Running ep. 0
     Initial position for this ep is 7.338690864048985,28.51815509409351,11.795143979909135
     Running ep. 1
     Initial position for this ep is  10.599326804010953,7.514871863851674,14.843070346933654
    
  • sed -e 'N;s/\n\|,/ /g'заменит символы новой строки и запятые на пробел

     Running ep. 0 Initial position for this ep is 7.338690864048985 28.51815509409351 11.795143979909135
     Running ep. 1 Initial position for this ep is 10.599326804010953 7.514871863851674 14.843070346933654
    
  • Наконец, 's/[^0-9. ]\+\|^[^0-9]\+//gзаменит все, что не является цифрой, точкой или пробелом или цифрой в начале строки

     0       7.338690864048985 28.51815509409351 11.795143979909135
     1       10.599326804010953 7.514871863851674 14.843070346933654
    
2
04.10.2021, 10:49

Использование любого awk в любой оболочке на каждом компьютере Unix:

$ awk '/Running ep/{ep=$NF} /Initial position/{print ep, $NF}' file
0 7.338690864048985,28.51815509409351,11.795143979909135
1 10.599326804010953,7.514871863851674,14.843070346933654

и если вы действительно хотите заменить эти запятые пробелами, тогда:

$ awk '/Running ep/{ep=$NF} /Initial position/{gsub(/,/," ",$NF); print ep, $NF}' file
0 7.338690864048985 28.51815509409351 11.795143979909135
1 10.599326804010953 7.514871863851674 14.843070346933654
2
04.10.2021, 20:28

Использование Raku (, ранее известного как Perl _6)

raku -ne 'if m/^^"Running ep. " $<ind> = [\d+] $$/ fff m/^^"Initial position for this ep is " $<val> = [.+] $$/ -> { ($<ind> || $<val> // "").split(",") andthen (.put if.chars) };'

ИЛИ

raku -ne '($<ind> || $<val> // "").split(",") andthen (.put if.chars) if m/^^"Running ep. " $<ind> = [\d+] $$/ fff m/^^"Initial position for this ep is " $<val> = [.+] $$/;'

Пример ввода:

Running ep. 0
...IMPORTANT...
Initial position for this ep is 7.338690864048985,28.51815509409351,11.795143979909135
...DISCARD...
...DISCARD...
...DISCARD...
Running ep. 1
...IMPORTANT...
Initial position for this ep is 10.599326804010953,7.514871863851674,14.843070346933654
...DISCARD...

Пример вывода (любой код выше):

0
7.338690864048985 28.51815509409351 11.795143979909135
1
10.599326804010953 7.514871863851674 14.843070346933654

Публикация этого, потому что OP запросил «что-то вроде» pattern1/pattern2, возвращающегося в той же строке, что предполагает, что возврат одной строки -не является абсолютным требованием.

Вкратце, оператор Раку fffиспользуется --, но только для возврата двух именованных -захватов. В общем, оператор Раку fffфлип -захватывает текст между двумя «сторожевыми» регулярными выражениями (, включая совпадения регулярных выражений, если это необходимо ). Скелетная версия кода fff.say if m/OPEN/ fff m/CLOSE/;. Это означает, что при оценке Sample Input секции с неважными строками ...DISCARD...отбрасываются.

Приведенный выше код считывает ввод -neпострочно, что позволяет эффективно использовать память -.Он использует$<ind>(индекс )и$<val>(значение )именованные захваты. В коде также используется ||короткое -замыкание OR, а также оператор Раку //«определено -ИЛИ», который возвращает правую часть, если левая часть не определена(Nil).

Хорошее вращение быстро меняет код с возврата только захватов (выше )на возврат парных захватов с промежуточными строками . Для второго примера строки кода вверху просто поместите код «named -regex+split» перед (.put if.chars)или запустите очень упрощенный код ниже:

raku -ne '.say if m/^Running/ fff m/^Initial/;'

Пример вывода (захват промежуточного текста):

Running ep. 0
...IMPORTANT...
Initial position for this ep is 7.338690864048985,28.51815509409351,11.795143979909135
Running ep. 1
...IMPORTANT...
Initial position for this ep is 10.599326804010953,7.514871863851674,14.843070346933654

https://docs.raku.org/routine/$СОЛИДУС$СОЛИДУС
https://raku.org

0
05.10.2021, 12:58

Теги

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