awk 스크립트에서 Ctrl-C 캡처

awk 스크립트에서 Ctrl-C 캡처

나는 믿습니다 Ctrl. Cbash 스크립트에 갇히는 것이 가능할 수도 있습니다. 이벤트를 처리하기 위해 이를 Awk 스크립트로 캡처하는 것도 가능합니까?

예를 들어, 처리를 중단하고 자동으로 종료하는 대신 처리된 결과를 인쇄하려면?

답변1

awk나는 이것을 지원하는 구현 을 알지 못합니다 . 당신은 할 수gawk이에 대한 확장을 작성하세요., 하지만 여기서는 다른 언어로 전환하고 싶습니다.

perlawk스크립트는 스크립트를 사용하여 쉽게 변환할 수 있습니다 a2p.

awk예를 들어 다음과 같은 스크립트가 있는 경우 :

{count[$0]++}
END {
  for (i in count) printf "%5d %s\n", count[i], i
}

a2p다음과 같은 내용을 제공합니다.

#!/usr/bin/perl
eval 'exec /usr/bin/perl -S $0 ${1+"$@"}'
    if $running_under_some_shell;
                        # this emulates #! processing on NIH machines.
                        # (remove #! line above if indigestible)

eval '$'.$1.'$2;' while $ARGV[0] =~ /^([A-Za-z_0-9]+=)(.*)/ && shift;
                        # process any FOO=bar switches

while (<>) {
    chomp;      # strip record separator
    $count{$_}++;
}

foreach $i (keys %count) {
    printf "%5d %s\n", $count{$i}, $i;
}

var=value이를 편집하여 신호 처리를 추가할 수 있습니다(여기서 필요하지 않은 매개변수 처리와 지원되지 않는 시스템에 대한 섹션을 제거 #!).

#!/usr/bin/perl

sub report {
  foreach $i (keys %count) {
      printf "%5d %s\n", $count{$i}, $i;
  }
}

$SIG{INT} = sub {
  print STDERR "Interrupted\n";
  report;
  $SIG{INT} = 'DEFAULT';
  kill('INT', $$); # report dying of SIGINT.
};

while (<>) {
    chomp;      # strip record separator
    $count{$_}++;
}

report;

또 다른 옵션은 중단하는 것입니다.데이터 피드로 변경 awk하고 awkSIGINT를 무시합니다. 예:

awk '{count[$0]++};END{for (i in count) printf "%5d %s\n", count[i], i}' file

하다:

cat file | (
  trap '' INT
  awk '{count[$0]++};END{for (i in count) printf "%5d %s\n", count[i], i}'
)

Ctrl+C그러면 죽이겠지만 cat그렇지는 않습니다 awk. awk파이프라인의 나머지 입력 처리는 계속됩니다.

Ctrl+C에서 감지하려면 awk다음을 수행할 수 있습니다.

(cat file && echo cat terminated normally) | (
  trap '' INT
  awk '{count[$0]++}
       END{
         if ($0 == "cat terminated normally") delete count[$0]
         else print "Interrupted"
         for (i in count) printf "%5d %s\n", count[i], i}'
)

답변2

신호 포착을 처리하는 것 외에도 입력을 awk 스크립트로 전달하는 쉘(bash 또는 dash 등) 래퍼 스크립트를 사용하여 목표를 달성할 수 있습니다.

관련 정보