linux awk内蔵関数およびawkでshellを呼び出す

9487 ワード

awk内蔵関数は、主に4種類に分けられます:算数関数、文字列関数、時間関数、一般関数
一、算術関数
次の算術関数は、C言語で同じ名前のサブルーチンと同じ操作を行います.
   	  
atan2( y, x )	   y/x     。
cos( x )	   x    ;x    。
sin( x )	   x    ;x    。
exp( x )	   x    。
log( x )	   x      。
sqrt( x )	   x    。
int( x )	   x         。
rand( )	       n,   0 <= n < 1。
srand( [Expr] )	  rand           Expr     ,      Expr           。        。

例:
awk 'BEGIN{OFMT="%.3f"; fs=sin(3.14/2); fe=exp(1); fl=log(exp(2)); fi=int(3.1415); fq=sqrt(100); print fs, fe, fl, fi, fq;}' 

結果:
1.000   2.718   2   3   10            # sin(3.14/2) = 1.000;        exp(1) = 2.718;          log(exp(2)) = 2;           int(3.1415) = 3;        sqrt(100) = 10

乱数:
awk 'BEGIN{srand(); fr=int(100*rand()); print fr;}'
結果:
64
9
25

二、文字列関数
関数の説明
gsub(Ere,Repl,[In])は,正規表現のすべての具体的な値が置換されている点を除いて,sub関数と全く同じように実行される.
sub(Ere,Repl,[In])は、Inパラメータによって指定された文字列のうち、Ereパラメータによって指定された拡張正規表現の最初の具体的な値を、Replパラメータによって指定された文字列に置き換えます.sub関数は置換数を返します.Replパラメータで指定された文字列に表示される&(および記号)は、Ereパラメータで指定された拡張正規表現と一致するInパラメータで指定された文字列に置き換えられます.Inパラメータが指定されていない場合、デフォルト値はレコード全体($0レコード変数)です.
Index(String 1,String 2)は、String 1パラメータで指定された文字列(String 2で指定されたパラメータが表示されている)で、位置を返し、1から番号を付けます.String 2パラメータがString 1パラメータに表示されない場合は、0(ゼロ)を返します.
length[(String)]は、Stringパラメータで指定した文字列の長さ(文字形式)を返します.Stringパラメータが指定されていない場合は、レコード全体の長さ($0レコード変数)を返します.
blength[(String)]は、Stringパラメータで指定した文字列の長さ(バイト単位)を返します.Stringパラメータが指定されていない場合は、レコード全体の長さ($0レコード変数)を返します.
substr(String,M,[N])は、Nパラメータで指定された文字数のサブ列を返します.サブストリングはStringパラメータで指定された文字列から取得され、その文字はMパラメータで指定された位置から始まる.Mパラメータは、Stringパラメータの最初の文字を番号1として指定します.Nパラメータが指定されていない場合、サブストリングの長さは、Mパラメータが指定した位置からStringパラメータの末尾までの長さになります.
match(String,Ere)は、Stringパラメータで指定された文字列(Ereパラメータで指定された拡張正規表現が表示されます)で位置(文字形式)を返し、1から番号を付けます.または、Ereパラメータが表示されない場合は0を返します.(ゼロ).RSTART特殊変数は戻り値に設定されます.RLENGTH特殊変数は、一致する文字列の長さに設定されます.または、一致が見つからない場合は-1(負)に設定されます.
split(String,A,[Ere])Stringパラメータで指定されたパラメータを配列要素A[1],A[2],.,A[n]は、n変数の値を返します.この分割は、Ereパラメータによって指定された拡張正規表現によって行うか、または現在のフィールド区切り記号(FS特殊変数)によって行うことができます(Ereパラメータが与えられていない場合).コンテキストが特定の要素に数値値があることを示す場合を除き、A配列の要素は文字列値で作成されます.
tolower(String)は、Stringパラメータで指定された文字列を返し、文字列の各大文字が小文字に変更されます.大文字と小文字のマッピングは、現在の言語環境のLC_CTYPEカテゴリ定義.
toupper(String)は、Stringパラメータで指定された文字列を返します.文字列の各小文字は大文字に変更されます.大文字と小文字のマッピングは、現在の言語環境のLC_CTYPEカテゴリ定義.
sprintf(Format, Expr, Expr, . . . ) Formatパラメータによって指定されたprintfサブルーチンフォーマット文字列に基づいてExprパラメータによって指定された式をフォーマットし、最後に生成された文字列を返します.
1)sub,gsub使用
awk 'BEGIN{info="this is a test in 2013-01-04"; sub(/[0-9]+/, "!", info); print info}'              # sub
  :
this is a test in !-01-04

awk 'BEGIN{info="this is a test in 2013-01-04"; gsub(/[0-9]+/, "!", info); print info}'            # gsub
  :
this is a test in !-!-!

2)index検索
awk 'BEGIN{info="this is a test in 2013-01-04"; print index(info, "test") ? "found" : "no found";}'                   #    “test” ,   “found;    ,    ”not found“
  :
found             

3)matchマッチング
awk 'BEGIN{info="this is a test in 2013-01-04"; print match(info, /[0-9]+/) ? "found" : "no found";}'                #       ,   “found;    ,    ”not found“
  :
found    

4)サブストリング
awk 'BEGIN{info="this is a test in 2013-01-04"; print substr(info, 4, 10);}'                 #  4-10  ,   1 
  :
s is a tes

5)split分割
awk 'BEGIN{info="this is a test in 2013-01-04"; split(info, tA, " "); print "len : " length(tA); for(k in tA) {print k, tA[k];}}'        #    “ ”   ,      ,     
  :
len : 6
4 test
5 in
6 2013-01-04
1 this
2 is
3 a

6)sprintfフォーマット出力
文字列のフォーマット:
フォーマットの説明
%d 10進符号付き整数
%u 10進符号なし整数
%f浮動小数点数
%s文字列
%c単一文字
%pポインタの値
%e指数形式の浮動小数点数
%x%X符号なし16進数で表される整数
%o符号なしで8進数で表される整数
%g適切な表現を自動的に選択
フォーマット文字列には2つの部分が含まれています.一部は正常な文字で、これらの文字はそのまま出力されます.もう1つの部分は、出力コンテンツのフォーマットを決定するために1つまたは複数の所定文字を「%」でフォーマットします.
awk 'BEGIN{n1=124.113; n2=-1.224; n3=1.2345; printf("n1 = %.2f, n2 = %.2u, n3 = %.2g, n1 = %X, n1 = %o
", n1, n2, n3, n1, n1);}' : n1 = 124.11, n2 = 18446744073709551615, n3 = 1.2, n1 = 7C, n1 = 174

三、時間関数
関数名の説明
mktime(YYYYYMMDD HHHMMSS[DST])生成時間フォーマット
strftime([format[,timestamp]])時間出力をフォーマットし、タイムスタンプを時間文字列に変換
具体的なフォーマットは、下表を参照してください.
Systime()はタイムスタンプを取得し、1970年1月1日から現在時刻(閏年を除く)までの秒数を返します.
strftime日付と時間フォーマット説明子
書式の説明
%a曜日の略語(Sun)
%A曜日の書き方(Sunday)
%b月名の略(Oct)
%B月名の完全な書き方(October)
%cローカル日付と時刻
%d 10進数日
%D日付08/20/99
%e日付、1人のみの場合はスペースが追加されます
%Hは24時間形式の時間を10進数で表す
%I 12時間形式の時間を10進数で表す
%j 1月1日から1年の何日目
%m 10進表記の月
%M 10進数の分
%p 12時間表記(AM/PM)
%S 10進表記の秒
%U 10進法は、1年の最初の週(日曜日は1週間の始まり)を表します.
%w十進法で表される曜日(日曜日は0)
%W 10進法で表される1年の数週間目(月曜日を1週間の始まりとする)
%xローカル日付の再設定(08/20/99)
%Xローカル時間の再設定(12:00:00)
%yの2桁の数字が示す年(99)
%Y現在の月
%Zタイムゾーン(PDT)
パーセント(%)
awk 'BEGIN{tstamp=mktime("2013 01 04 12 12 12"); print strftime("%c", tstamp);}'
  :
Fri 04 Jan 2013 12:12:12 PM CST

awk 'BEGIN{tstamp1=mktime("2013 01 04 12 12 12"); tstamp2=mktime("2013 02 01 0 0 0"); print tstamp2-tstamp1;}'
  :
2375268

awk 'BEGIN{tstamp1=mktime("2013 01 04 12 12 12"); tstamp2=systime(); print tstamp2-tstamp1;}'
  :
33771

四、一般関数
関数の説明
close(Expression)は、print文またはprintf文で開いているファイルまたはgetline関数を呼び出して開いているパイプを、同じ文字列値を持つExpressionパラメータで閉じます.ファイルまたはパイプが正常に閉じられた場合は、0を返します.その他の場合はゼロ以外の値を返します.ファイルを書き、後で同じプログラムでファイルを読み込む場合はclose文が必要です.
System(Command)は、Commandパラメータで指定したコマンドを実行し、終了状態に戻ります.システムサブルーチンと同等です.
Expression
getline[Variable]は、Expressionパラメータで指定されたコマンドの出力からパイプを介して転送されるストリームから入力レコードを読み出し、そのレコードの値をVariableパラメータで指定された変数に指定します.Expressionパラメータの値をコマンド名とするストリームが現在開いていない場合は、ストリームが作成されます.作成されたストリームはpopenサブルーチンを呼び出すのと同じで、CommandパラメータはExpressionパラメータの値をとり、Modeパラメータはrの値に設定されます.ストリームが開いていてExpressionパラメータが同じ文字列を求める限り、getline関数の後続呼び出しのたびに別のレコードが読み出されます.Variableパラメータが指定されていない場合、$0レコード変数とNF特殊変数はストリームから読み込まれたレコードに設定されます.
getline[Variable]getline[Variable]では、Variableパラメータで指定した変数を、現在の入力ファイルから読み込まれた次の入力レコードに設定します.Variableパラメータが指定されていない場合、$0レコード変数はレコードの値に設定され、NF、NR、FNRの特殊変数も設定されます.

1)closeの使い方
awk 'BEGIN{while("cat /etc/passwd" | getline) {print $0;}; close("/etc/passwd");}' | head -n10
  :
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/bin/sh
bin:x:2:2:bin:/bin:/bin/sh
sys:x:3:3:sys:/dev:/bin/sh
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/bin/sh
man:x:6:12:man:/var/cache/man:/bin/sh
lp:x:7:7:lp:/var/spool/lpd:/bin/sh
mail:x:8:8:mail:/var/mail:/bin/sh
news:x:9:9:news:/var/spool/news:/bin/sh

2)getlineの使い方
awk 'BEGIN{while(getline < "/etc/passwd"){print $0;}; close("/etc/passwd");}' | head -n10
  :
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/bin/sh
bin:x:2:2:bin:/bin:/bin/sh
sys:x:3:3:sys:/dev:/bin/sh
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/bin/sh
man:x:6:12:man:/var/cache/man:/bin/sh
lp:x:7:7:lp:/var/spool/lpd:/bin/sh
mail:x:8:8:mail:/var/mail:/bin/sh
news:x:9:9:news:/var/spool/news:/bin/sh

awk 'BEGIN{print "Enter your name:"; getline name; print name;}'
  :
Enter your name:
root
root

3)システムの使い方
awk 'BEGIN{b=system("ls -al"); print b;}'
  :
total 32
drwxr-xr-x 2 homer homer 4096 2013-01-04 20:27 .
drwxr-xr-x 4 homer homer 4096 2013-01-04 11:35 ..
-rw-r--r-- 1 homer homer 1773 2013-01-04 19:54 2013-01-03_output_top800_title_url.log
-rw-r--r-- 1 homer homer 1773 2013-01-04 19:55 2013-01-04_output_top800_title_url.log
-rwxr-xr-x 1 homer homer  555 2013-01-04 20:23 catline.sh
-rw-r--r-- 1 homer homer   26 2013-01-04 20:27 ret.txt
-rw-r--r-- 1 homer homer   16 2013-01-04 19:58 str2.txt
-rw-r--r-- 1 homer homer   16 2013-01-04 11:15 str.txt
0