BLOGTIMES
» ArchiveList (Tag for "awk" )
«Prev || 1 · | Next»
2018/08/07

Windows で手軽に awk を使うには

windows  cli  awk 
busybox-w32 - Windows で手軽に awk を使うには

Windows で sed や awk などの Unix 系のコマンドラインツールを使いたい場合には Cygwin や WSL を使うことが多いと思いますが、もっと手軽に導入できる方法がないかと思って調べていたら busybox の win32 版を見つけたのでメモ。

busybox は1つのバイナリの中に様々な Unix 系ツールを内蔵しているアーミーナイフのようなアプリで、IT エンジニアに身近なところだと VMWare ESXi のコンソールのコマンドのほとんどは busybox だったりします。

busybox-w32

BusyBox is a single binary that contains many common Unix tools. It's often found in embedded Linux systems like routers, in Android smartphones, in Linux containers and anywhere else it would be handy to have a compact set of Unix command line tools.

Windows でちょっとしたバッチを書いていて「どうしても awk が使いたい!」ということになった時に非常に役に立ちます。


    at 17:55 |
    2017/01/13

    Postfix のバーチャルドメインで Mailman

    postfix  mailman  awk 

    Postfix と Mailman の連携については公式の Wiki に 「DOC/Mailman - Postfix integration with Mailman generated transport or other maps - Mailman Wiki」というドキュメントがあり、virtual_to_transport というスクリプトを作って transport_maps 用のファイルを生成する方法が解説されています。

    ただ、この方法でも結局 local に配送して alias で処理をするという部分は変わらないので、純粋にバーチャルドメインだけで Postfix + Mailman 連携ができる方法がないかと思っていろいろと試行錯誤してみました。

    参考にしたのは「[mmjp-users 1929] Postfix で純仮想ドメイン (思いつき)」という投稿。基本路線はこれを踏襲しますが、具体的な transport_maps 用のファイルの生成方法が書かれていなかったので、以下のようなスクリプトを組んでみました。

    /etc/mailman/virtual_to_transport

    #!/bin/bash gawk ' BEGIN{ MLNAME = ""; } /^mailman-loop/ { printf("#%s\n",$0); next; } /^# STANZA START:/ { MLNAME = gensub(/^# STANZA START: (.+)/,"\\1",1,$0);} /^#/ { print ; next ;} MLNAME == "" { print; next; } MLNAME != "" && /@/{ sub(MLNAME, "",$2); if( $2 ~ /^-/ ){ printf("%s\tmailman-%s:%s\n", $1, substr($2,2), MLNAME); } else { printf("%s\tmailman-post:%s\n", $1, MLNAME); } } ' < /etc/mailman/virtual-mailman > /etc/mailman/transport-mailman /usr/sbin/postmap /etc/mailman/transport-mailman if [ -n "$1" ]; then /usr/sbin/postmap $1 fi

    Postfix 側の設定として/etc/postfix/master.cf に以下の行を追加しておきます。

    ##### mailman ######### mailman-post unix - n n - - pipe flags=FR user=mailman:mailman argv=/usr/lib/mailman/mail/mailman post ${nexthop} mailman-admin unix - n n - - pipe flags=FR user=mailman:mailman argv=/usr/lib/mailman/mail/mailman admin ${nexthop} mailman-bounces unix - n n - - pipe flags=FR user=mailman:mailman argv=/usr/lib/mailman/mail/mailman bounces ${nexthop} mailman-confirm unix - n n - - pipe flags=FR user=mailman:mailman argv=/usr/lib/mailman/mail/mailman confirm ${nexthop} mailman-join unix - n n - - pipe flags=FR user=mailman:mailman argv=/usr/lib/mailman/mail/mailman join ${nexthop} mailman-leave unix - n n - - pipe flags=FR user=mailman:mailman argv=/usr/lib/mailman/mail/mailman leave ${nexthop} mailman-owner unix - n n - - pipe flags=FR user=mailman:mailman argv=/usr/lib/mailman/mail/mailman owner ${nexthop} mailman-request unix - n n - - pipe flags=FR user=mailman:mailman argv=/usr/lib/mailman/mail/mailman request ${nexthop} mailman-subscribe unix - n n - - pipe flags=FR user=mailman:mailman argv=/usr/lib/mailman/mail/mailman subscribe ${nexthop} mailman-unsubscribe unix - n n - - pipe flags=FR user=mailman:mailman argv=/usr/lib/mailman/mail/mailman unsubscribe ${nexthop}

    さらに /etc/postfix/main.cf の既存の設定に以下を追加します。
    (・・・・の部分は既存の項目に読み替えてください。既存の項目がなければ新規に項目を追加します。)

    transport_maps = ・・・・・, hash:/etc/mailman/transport-mailman virtual_transport_maps = ・・・・・, hash:/etc/mailman/transport-mailman virtual_mailbox_maps = ・・・・・, hash:/etc/mailman/transport-mailman

    これで上手く動いているようなのですが、少し調子を見てみたいと思います。


      at 20:31 |
      2016/04/25

      awk で指定した n カラム目以降を出力する

      awk 

      awk では各カラムを $1, $2, $3, $4 ・・・・ という感じでアクセスできるようになっていますが、 n カラム目から最後まですべて出力したかったのでスマートな方法がないかどうか調べてみました。
      どうやらあまりスマートな方法はなくて、以下のようにfor 文を使って繰り返しで書くしかないようです。

      $ ls -l | awk '{for(i=4;i<NF;++i){printf("%s ",$i)}print $NF}' 3509596 apache 520412 Jul 21 2005 050722-DVC50048.JPG apache 255977 Jul 21 2005 050722-DVC50049.JPG apache 232074 Jul 21 2005 050722-DVC50050.JPG apache 4260 Jul 6 2012 1104287101-image-small.jpg apache 7986 Jul 6 2012 1104287101-image.jpg apache 1811 Jul 6 2012 1104496203-image-small.jpg apache 5321 Jul 6 2012 1104496203-image.jpg apache 3988 Jul 6 2012 1104677102-image-small.jpg apache 7501 Jul 6 2012 1104677102-image.jpg

      これならば以下の cut を使った場合の方がスマートですね。

      $ ls -l | cut -d ' ' -f 4- apache 520412 Jul 21 2005 050722-DVC50048.JPG apache 255977 Jul 21 2005 050722-DVC50049.JPG apache 232074 Jul 21 2005 050722-DVC50050.JPG apache 4260 Jul 6 2012 1104287101-image-small.jpg apache 7986 Jul 6 2012 1104287101-image.jpg apache 1811 Jul 6 2012 1104496203-image-small.jpg apache 5321 Jul 6 2012 1104496203-image.jpg apache 3988 Jul 6 2012 1104677102-image-small.jpg apache 7501 Jul 6 2012 1104677102-image.jpg

        at 12:44 |
        2014/06/20

        awk で自身のプロセス ID を得る

        awk 

        例えば bash で自身のプロセス ID を知りたい場合には $$ という特殊変数を参照することができます。
        今日はこれと同じことを awk でやろうとしたらハマってしまったので、後学のためにメモ。

        やりたかったのは下記のような感じのログにタイムスタンプを付与するスクリプトにプロセス ID を追加することでした。

        $ seq 1 5 | awk '{print strftime("%Y-%m-%d %T ") $0; system("");}' 2014-06-20 21:57:01 1 2014-06-20 21:57:01 2 2014-06-20 21:57:01 3 2014-06-20 21:57:01 4 2014-06-20 21:57:01 5

        マニュアルを隅から隅まで調べていくと、PROCINFO["pid"] という特殊変数に入っているみたいです。
        もしかしたらこれは gawk でないと動かないかもしれません。

        The GNU Awk User’s Guide: Auto-set

        PROCINFO["pid"] The process ID of the current process.

        とりあえずこれを使ってやりたいことは達成できました。

        $ seq 1 5 | awk '{print strftime("%Y-%m-%d %T ") "[" PROCINFO["pid"] "] " $0; system("");}' 2014-06-20 21:57:01 [14631] 1 2014-06-20 21:57:01 [14631] 2 2014-06-20 21:57:01 [14631] 3 2014-06-20 21:57:01 [14631] 4 2014-06-20 21:57:01 [14631] 5

          at 22:00 |
          2014/02/14

          awk に標準出力をバッファさせないようにする

          awk  sh 

          vmstat の出力にはタイムスタンプがないので、こんな感じで awk を使ってタイムスタンプをつけていたのですが、これをファイルにリダイレクトして、そのファイルを tail -f で追いかけてみても一向に内容が更新されないという現象が発生して困ってしまいました。

          $ vmstat 1 | awk '{print strftime("%Y-%m-%d %T ") $0;}' 2014-02-14 21:12:56 procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------ 2014-02-14 21:12:56 r b swpd free buff cache si so bi bo in cs us sy id wa st 2014-02-14 21:12:56 2 0 105736 70564 267812 603616 0 0 6 5 0 0 3 1 96 0 0 2014-02-14 21:12:57 0 0 105736 70604 267820 603608 0 0 0 96 1059 499 0 0 100 0 0 2014-02-14 21:12:58 0 0 105736 70604 267820 603608 0 0 0 0 1042 361 0 0 100 0 0

          コンソールでは問題ないのに、リダイレクトすると問題が出るというパターンは、これまでにも C 言語の printf()Python でハマった経験から、標準出力のバッファリングの問題に間違いないということで、今日は awk の標準出力のバッファリングを無効にする方法を調べてみました。

          [awk に標準出力をバッファさせないようにする の続きを読む]

            at 21:13 |
            2010/01/04

            プログラミング言語 AWK が復刊

            awk  復刊  oreilly 
            プログラミング言語AWK (新紀元社情報工学シリーズ)

            絶版になっていたプログラミング言語AWKが復刊されるようです。本格的な言語として使うということは少ないと思いますが、シェルスクリプト中のちょっとした文字列加工をやるにはAWK便利ですからね。

            プログラミング言語AWK A. V. エイホ、P. J. ワインバーガー、B. W. カーニハン 著/足立高德 翻訳 販売ページ

            1989年に初めての邦訳が刊行され、その後何回か絶版の憂き目にあいつつも、不死鳥のごとく蘇り、様々な出版社から復刊を果たしている「プログラミング言語AWK」。この度、AWKファンの熱い声に支えられ、USP出版から3回目の復刊を果たします。
            テキスト処理と演算に絶大な効果を発揮する「AWK」は、開発当時の1970年代から、開発者たちによって「30年後、ハードウェアの性能が向上するころに、その真価がわかるだろう」と予言されていたといいます。事実、インターネットの普及により、テキストで書かれたHTMLが大量に生成され、多くの人がテキストデータに触れるようになった昨今において、軽量で簡単にテキストを処理することができるAWKの良さが見直されつつあります。

            僕もいちおう新紀元社発行(写真のもの)のやつは持っているですが、シェルスクリプトと組み合わせて使うような場合を考えると、オライリーの「sed&awkプログラミング」の方が役に立つかもしれません。


              at 20:12 |
              2006/04/11

              久々のawkで

              awk  programming 
              sed&awkプログラミング

              100個以上もあるcsvファイルの先頭の一行(列ラベルの部分)を切り取って一つのファイルにまとめないといけないという状況に追い込まれたので、awkを使ってさっくり片付けてみました。こういうときのためにノートPCにもCygwinを入れておいて正解でした。

              find -name '*csv' | xargs -n 100 awk '(FNR > 1 ){print $0}' > out.csv

              昔はログ集計なんかに良く使っていたんですがすっかりご無沙汰だったので、どうしてもこのFNRが思い出せなくてしばらく悩んだ末*1、本棚のsed&awkプログラミングに頼ってしまいましたけど。おそらくperlのワンライナーでも同じように書けると思うんですが、perlも最近使っていないのでawk以上にどうかいたらいいか浮かんできませんでした。

              • *1: 最初NRと書いてたんですが、そうするとすべてのファイルを通算して最初の1行目しか削除されなかった。

              at 21:01 |
              «Prev || 1 · | Next»
              » ArchiveList (Tag for "awk" )