Можно ли сохранить разделитель записей в awk?

Это сложно. Вот что я придумал: Может быть возможно упростить/упростить его:

#!/bin/sh

pid1file=$(mktemp)
pid2file=$(mktemp)
stat1file=$(mktemp)
stat2file=$(mktemp)

while true; do sleep 42; done &
main_sleeper=$!

(cd frontend && gulp serve           & echo "$!" > "$pid1file";
    wait "$!" 2> /dev/null; echo "$?" > "$stat1file"; kill "$main_sleeper" 2> /dev/null) &
(cd backend  && gulp serve --verbose & echo "$!" > "$pid2file";
    wait "$!" 2> /dev/null; echo "$?" > "$stat2file"; kill "$main_sleeper" 2> /dev/null) &
sleep 1
wait "$main_sleeper" 2> /dev/null

if stat1=$(<"$stat1file")  &&  [ "$stat1" != "" ]  &&  [ "$stat1" != 0 ]
then
        echo "First process failed ..."
        if pid2=$(<"$pid2file")  &&  [ "$pid2" != "" ]
        then
                echo "... killing second process."
                kill "$pid2" 2> /dev/null
        fi
fi
if [ "$stat1" = "" ]  &&  \
   stat2=$(<"$stat2file")  &&  [ "$stat2" != "" ]  &&  [ "$stat2" != 0 ]
then
        echo "Second process failed ..."
        if pid1=$(<"$pid1file")  &&  [ "$pid1" != "" ]
        then
                echo "... killing first process."
                kill "$pid1" 2> /dev/null
        fi
fi

wait
if stat1=$(<"$stat1file")
then
        echo "Process 1 terminated with status $stat1."
else
        echo "Problem getting status of process 1."
fi
if stat2=$(<"$stat2file")
then
        echo "Process 2 terminated with status $stat2."
else
        echo "Problem getting status of process 2."
fi
  • Сначала запустите процесс (, пока верно; спят 42; выполнено & ) что спит/останавливается навсегда. Если вы уверены, что ваши две команды завершится в течение определенного периода времени (например, часа), вы можете изменить это на один сон, который превысит (например, спящий 3600 ). Затем можно изменить следующую логику, чтобы использовать ее в качестве тайм-аута; то есть, убить процессы, если они все еще работают через столько времени. (Обратите внимание, что приведенный выше сценарий в настоящее время этого не делает.)
  • Запустите два асинхронных (параллельных фоновых) процесса.
    • Для cd не требуется ./.
    • команда & эхо «$!» > где-то ; подождите «$!» является сложной конструкцией, которая запускает процесс асинхронно, захватывает его PID, а затем ожидает его; создание своего рода основного (синхронного) процесса. Но это происходит в пределах списка (...) который полностью находится на заднем плане, поэтому процессы gulp выполняются асинхронно.
    • После завершения любого из процессов gulp , записать его статус во временный файл и завершить процесс «вечно спящего».
  • сон 1 для защиты от состояния гонки где первый фоновый процесс умирает прежде чем второй получит возможность записать свой PID в файл.
  • Дождитесь завершения процесса «вечно спящего». Это происходит после завершения одного из процессов gulp , как указано выше.
  • См., какой фоновый процесс завершен. Если не получилось, убей другого.
  • Если один процесс не удался, а мы убили другой, дождитесь завершения второй операции и сохраните ее состояние в файле. Если первый процесс завершен успешно, дождаться окончания второго.
  • Проверьте статусы двух процессов.

-121--30243-

Можно также использовать perl в качестве команды oneliner. Например, для этой проблемы можно использовать:

 $ perl -p -e 'if (/^T/) { s/\|0*/\|/g } ' SampleFileName
 H|09/24/2015
 D|25.00|Name1|Tfile|5
 D|7.25|Name2|Tfile|1
 T|32.25|3
 $  

В , если regex проверяет, начинается ли строка с буквы T (как я предполагаю, эти строки являются целевыми), и в {} блок regex заменяет все нули после | канала.

-121--157485-

ttyPCIx устройства не являются простыми портами USB, а скорее устройствами USB UART , которые эмулируют последовательный порт через USB. Они часто основаны на чипе Pluffic (PL2303) или FTDI. Вы должны будете получить такое устройство и подключить его к компьютеру для того, чтобы появилась запись /dev/tтyPCIx в том же пути, как при подключении USB-устройства флэш-памяти создается устройство /dev/sdx .

1
12.04.2018, 10:12
1 ответ

Вы можете использовать RT

 gawk 'BEGIN{RS="(DEBUG|INFO)"; FS="\n"}{printf "%s%s", $0, RT}' log.txt 
5
27.01.2020, 23:23

Теги

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