awkスクリプトからCtrl-Cをキャプチャする

awkスクリプトからCtrl-Cをキャプチャする

私は信じていますCtrlCbashスクリプトに閉じ込めることも可能です。イベントを処理するためにこれを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;

別のオプションは中断することです。データフィードに変更しawkawkSIGINTを無視します。例:

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ありませんawkawkパイプラインの残りの入力処理は続行されます。

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}'
)

おすすめ記事