Bye Bye Moore

猫マンション建築の野望を胸に零細事業主として資本主義の荒波に漕ぎ出したアラサー男の技術メモ

awk

awkに変数を初期設定する

awk

BEGINで設定する方法もあるのですが、"-v"を使うと引数として設定できます。 ワンライナーをゴリゴリ書きたい時に使えますね。 実際のところ $ awk -v whoami="you" "{print whoami}" you 複数指定も可能 $ awk -v fizz=3 -v buzz=5 "{print fizz * buzz}" 1…

awkでbash用のコマンドを使う

awk

dateコマンドで標準入力からの日付文字列を受け取り評価する - Bye Bye Moore と awkでN時間後の数値を設定したいなら……?? - Bye Bye Moore の合わせ技で、awkでdateコマンドのN時間後記法を実行してみます。bashのコマンドを使う場合、system関数を使うか…

dateコマンドで標準入力からの日付文字列を受け取り評価する

awk

実際のところ 標準入力を示す記号は"-"なので、こいつを"-f"オプションでうけとり評価します。 $ echo 2020/01/06 18:00:00 | date +'%y年%m月%d日%H時' -f - 20年01月06日18時now、yesterdayといったパターンの受け取りも可能です $ echo yesterday | date …

awkでN時間後の数値を設定したいなら……??

awk

特定の日時文字列があって、それのN時間後を知りたい事って割とありますよね。 国際標準時を日本標準時にするときとか。 実際のところ "-V"オプションでdateコマンドの式展開をしてやると良いです。 $ awk -vDate="`date -d'now' +'%Y/%m/%d_%H:%M:%S'`" '{p…

awkで16進数をよろしく使う"non-decimal-data"オプション

awk

実際のところ 以下は "GNU Awk 4.1.4, API: 1.1 (GNU MPFR 4.0.1, GNU MP 6.1.2)" での実行例です。 OSのデフォルトのawkでは対応してなかったりするので注意。なんもないと $ echo 0xdeadbeef | awk '{print $1 "\n ~> " $1+0}' 0xdeadbeef ~> 0 ですが、こ…

シェルスクリプトの関数の引数として文字列をわたすと行頭スペースが勝手にパースされたりする件

……printfやechoで、行頭のスペースが消されて見えなくなるというあれが。 スクリプトの方はちゃんと整形していても、出力でお節介されたらたまりません。shunit2でテストをやろうとした時、先頭にスペースがあって然るべき文字列として渡しても、 スペースを…

ビッグエンディアンで数バイト格納されているデータをsedやawk でパースする

ビッグエンディアンで2バイト、1バイト、1バイトと格納されている文字列が来ていたとします。 こいつをリトルエンディアンで置き換えるには先頭だけ入れ替えてあげればいいですね。 $ echo AD7399AF | sed -e "s/\([1-9A-F]\{2\}\)\([1-9A-F]\{2\}\)\(.*\…

awkで16進数1バイトな文字列を取り扱う

awk

実際のところ たとえば"0F"といった感じの値で出力されてくる場合、 文字列の頭に"0x"とつけて、printfで出力してやれば10進数になります。 $ awk 'BEGIN { val="0x""0F"; printf "%d",val }' 15 演算してからの格納もOK $ awk 'BEGIN { val="0x""0F"; val=v…

awkの出力はprint/printfコマンド毎に指定できる

awk

awkの出力はprint/printfコマンド毎に指定できます。 他の言語だと死ぬほど面倒な処理も、awkだとさすがのスマートさです。 実際のところ $ echo 1,2,3 | awk -F "," '{printf "%04d", $1 > "file0001.txt"; printf "%04d", $2 > "file0002.txt" }' 中身をみ…

パイプでawkスクリプトに繋ぐ場合、変数はもちこせる

awk

パイプでawkを使ったとき、その変数は共通で持ち越せます。 ……今まで使ってて気づかんかったんかという話ですが…… 実際のところ seqで10行作って、BEGINでcntを定義、毎回2足していくという単純なモンの場合…… $ seq 1 10 | awk "BEGIN {cnt = 0}; {print c…

awkの正規表現でSHELL変数は使えない……なんて事はなかった!

awk

shuzo-kino.hateblo.jp に、こんなコメントを頂きました。 ilex echo "12 hoge fuge" | awk '$1 ~ /^'"$SHELL_VAR"'/{print "アルヨ〜"}' または echo "12 hoge fuge" | awk 'BEGIN{var="^"'"$SHELL_VAR"'}$1~var{print "アルヨ〜"}' でいけるようです。 早…

awkのgsub/sub関数でマッチした文字の前後に細工をしたい場合

awk

awkのgsub/sub関数でマッチした文字の前後に細工をしたい場合、 マッチした文字をキャプチャしてくれるのは"&"です。 実際のところ たとえばgsubなら $ echo 12345678 | awk 'gsub(/[0-9][0-9]/, "&-")' 12-34-56-78- $ echo abc | awk ' gsub(/あ*/, " // &…

AWKの関数呼び出しは入れ子構造にできる

awk

AWKの関数呼び出しはrubyのように入れ子にできます。 実際のところ shuzo-kino.hateblo.jp でやった日付呼び出しの例を考えてみます。これが $ awk 'BEGIN {the_time = strftime("%y%m%d%H%M%S"); print the_time}'こうなります $ awk "BEGIN {print strftim…

awkのprint文は出力先としてファイルを指定できる

awk

awkのprint文はファイルを出力先として指定できます。 一個のawkファイルで出力先を複数指定できます。 実際のところ 以下の様なファイルがあっとします。 $ cat sample0719.txt cat cat dog person catこれを、以下の様なawkファイルに掛けると…… BEGIN { c…

awkにおいて、演算子"~"は特定の文字列を含んでいる場合"1"を返す

awk

一致すると、"1"を返します。 $ printf "foo bar buzz" | awk '{print $0 ~ /ba/}' 1否定版もあります。 $ printf "foo bar buzz" | awk '{print $0 !~ /bar/}' 0条件式に組み込むこともできるので、知ってると少し短く書けるかも $ printf "foo bar buzz" |…

Gitでコミット数を知るワンライナー

Gitでコミットした量を知るワンライナーです。 git logは各種ログがでてきますが、awkでこれの”Date”分を抽出し、"uniq -c"で出てきた個数を数えると……コミット回数をリストアップできます。 $ git log | awk '/Date/{print " : " $4 " " $3 " " $6}' | uniq…

awkにおける変数設定オプションとファイルの順番について

awk

awkにおける変数設定オプションとファイルの順番は「変数設定オプション」=>「ファイル」の順です。 実際のところ $ tail sample.txt sample2.txt ==> sample.txt <== a b c d e f 89 01 23 45 61 31 94 ==> sample2.txt <== GNU EMACS PYTHON RUBY $ gawk '…

Javascriptでawkが動く。魔界ライブラリWebAWK

awk

WebAWKは、Javascript実装のAWKです。 オンラインでもは此方。 WebAWK - client-side awk in Javascript導入は簡単です。 gitからコードを導入し…… $ git clone git://github.com/agordon/webawk.git $ cd webawk/仮ビルド=>必要な形態にビルド。 まずは試し…

awkで標準出力に表示された数値を数値型で扱う3つの方法

awk

ゼロ加算 awk界隈ではよく見かける方法です。 printf記法、print記法共に16進数は予定通り動いてくれないので注意が必要です。 $ echo 123 0x123 | gawk '{print $1+0, $2+0}' 123 0 $ echo 123 0x123 | gawk '{printf "%d %d\n", $1+0, $2+0}' 123 0 strton…

awkプログラムを単独実行可能な状態にしておく

awk

ある程度スクリプトの内容が熟れてきたら、 awkスクリプトの単独実行を検討してみるのもいいでしょう。 実際のところ 標準出力から数字列を受け取り、fizzbuzzの個数を受け取る以下のようなスクリプトがあったとします。 BEGIN { count = 0 } $1 % 3 == 0 &&…

awkでredisやXML、PostgreSQLを使う魔界拡張

awk

gawkには、「gawkextlib」という外部拡張群が用意されています。 公式から文言を引用すると The gawkextlib project provides a number of gawk extensions, including one for processing XML files. XML読み込みを主目的に開発された事がわかります。実際…

awkの文字列系便利関数

awk

awkの文字列系便利関数はデフォルトでいくつかついてます。 RubyやPythonに慣れていれば大体挙動は同じです。 メソッドチェインみたいな事は不得手ですが。 文字列系便利関数 index 先頭からの文字数をカウントする関数です。 1文字以上の文字列に一致、そ…

awkにもsplit関数がある

awk

配列といえば、おなじみsplit関数。 awkにもあります。 ちょっと便利な機能がついて。 実際のところ 普通に使うだけなら、変数は2個です。 分割する文字列、格納先の配列という順。 $ gawk 'BEGIN{a ="Hello World, yo"; split(a, ary); print ary[1]}' Hel…

awk組み込みの怪関数「gensub」

awk組み込みの「gensub」は a GENeral SUBstitution function. という事で、sub関数を拡張したような使いかたをします。 関数の引数は以下の通り。 gensub(regexp, replacement, how [, target]) *実際のところ 既存文字列を抽出し、並び替えて別の文を作る…

配列の内容を消すときにはdelete

awk

awkで配列のカラムを消す時は delete ary[index] です 実際のところ BEGIN { PROCINFO["sorted_in"] = "@ind_str_asc" ary[3] = "j" ary[1] = "t" ary[2] = "a" ary[0] = "b" delete ary[2] for (i in ary) print i, ary[i] } #>> 0 b #>> 1 t #>> 3 j 参考…

配列の格納順を決める変数PROCINFO["sorted_in"]

awk

AWKで配列の格納順を決める変数として、PROCINFO["sorted_in"]があります。 実際のところ 以下のようなスクリプトがあったとします。 BEGIN { PROCINFO["sorted_in"] = val ary[3] = "j" ary[1] = "t" ary[2] = "a" ary[0] = "b" for (i in ary) print i, ar…

awkの配列をfor文で順繰りに読む

awk

awkの配列をfor文で順繰りに読む場合、 eachのような気の利いた関数はないので、 シェルなどと同様 for ( NUM in ARY )てな書き方になります。 実際のところ BEGIN { a["here"] = "here" a["is"] = "is" a["a"] = "a" a["loop"] = "loop" for (i in a) { j++…

awkでARGV系変数を扱う

awk

awkにも、引数を取得するARGV系変数があります。 引数の総数を見るARGCという便利変数もついてるので、やりようによっては色々応用が効く可能性があります。 実際のところ 引数で変数A、Bを定義し、awkスクリプト内で参照するようなスクリプトの場合、 もっ…

awkの-vオプションで初期値を与える

awk

awkの-vオプションは初期値を与えるオプションです。 似た処理を変数変えてやりたい時に有効ですね。 実際のところ $ gawk -v A=2 'END{ printf "A:%d + B:%d\n", A, B}' B=4 /dev/null A:2 + B:4最後にある/dev/nullがミソです。 これがないと、無限参照で…

awkスクリプト内部で、他のファイルに記述した設定を呼び出したい場合

awk

awkスクリプト内部で、他のファイルに記述した設定を呼び出したい場合ってありますよね。 この場合、標準拡張のreadfileかrwarryを使うと良いです。 実際のところ readfile 単純にファイルを読み出すだけなら、以下のような感じでいけます。 一本の文字列と…