awk



複数行の取り扱い

  • BEGIN { RS=""; FS="\n" }

演算子

  • 文字列連結「演算子」
    • 単なる空白
    • print "abc" "def" $0

正規表現

  • マッチした行の xx 行後を表示
    • awk '{ if(0 ~ /ms/) { R=NR } if( NR == R+2 ) { print 0 }}' bcpOut.log
  • インターバル表現
    • echo 'HQ123456' | gawk --posix '$0 ~ /HQ[0-9]{6}/ { print "matched.."}'

リダイレクト

	#!/bin/csh
	
	#
	# Change into target directory
	#
	cd ~/bin
	
	#
	# Backup
	#
	mv sdfeuc sdfeuc.bak
	
	#
	# Toggle passwd
	#
	gawk 'BEGIN { word1 = "hoge"; word2 = toupper(word1) } \
	\
	      { if( $1 == "ISQL") { \
	          if( $4 == word1) { old = word1; new = word2; } \
	          else { old = word2; new = word1; } \
	          $4 = new; \
	\
	          print "sp_password " old "," new > "sp_password.sql" \
	        } \
	\
	        { print $0 > "sdfeuc"} \
	\
	      }' sdfeuc.bak
	
	#
	# Change passwd
	#
	sdfeuc.bak sp_password.sql
	
	#
	# Delete backup
	#
	if ( $status == 0) then
	  rm sp_password.sql
	  rm sdfeuc.bak
	endif
	
	#
	#  Change mode
	#
	chmod uga-wrx sdfeuc
	chmod u+wrx sdfeuc
	

gawk(win)

  • tail
    • awk "{ if( NR>100) { exit } else { print $0 } }" hoge.txt
    • elseも使える
    • ダブルクォーテーションでないとダメのよう
 #!/bin/csh
 
 # パイプを使って標準入力からのデータを使用できるが
 # fileNameに標準入力からのデータがセットされているわけではなく、
 # ファイル名が省略されたと判断されているよう
 # (ファイル名が省略されたとき、awkでは、標準入力が使用される)
 
 set fileName = $1
 awk '{print $1;}' $fileName

変数

  • 現レコードの内容全体を $0
  • 偶数行だけを表示することもできます。
    • awk 'NR%2 == 0' summer91
  • ARGC 個数
  • ARGV 全体

フィールドの句切り

  • デフォルトは空白とタブ
  • ypcat passwd | awk -F: '/username/ {print 1,4}'
  • awk -F\t ... (シングルクォートで囲むとタブとして解釈されない)
  • 2文字以上を指定すると正規表現として解釈される

パターン

	awk -F: '$2 == ""' file2
	$2 == ""        ・・・・・・・ 2番目のフィールドがからである
	$2   /^$/       ・・・・・・・ 2番目のフィールドが空文字列と一致する
	$2 !  /./       ・・・・・・・ 2番目のフィールドがいかなる文字とも一致しない
	length($2) == 0 ・・・・・・・ 2番目のフィールドの長さが0である。
	記号 ~ は正規表現との一致を、 !~ は一致しないことを意味しています。
	(正規表現は/で囲まれる)
	BEGIN と END
		BEGIN {printf"LNUM  TEXT¥n"} 
		         {printf"%4d : %s¥n",NR,$0}
		END {printf"これでおわり¥n"}
	
	範囲
		awk 'NR == 1,NR == 10 {print $0}' summer91
		は1レコード(行)目から10レコード(行)目までを表示します。 
	2番目のフィールドがaで始まったら...
		awk '$2 ~  /^a/' summer91
		awk '$2 !~ /^[a-n]/' summer91

sample

	{ for(i=1;i<NF;i++) {
		if($i ~ /[0-9]/ && length($i)>8) {
		  printf("%s \t %s \n",NF,$i)
		}
	  }
	}
	#!awk -F'-' -f % b
	awk '{print $'$1'}'
	#シェルの引数

sp_spaceused

	echo off
	REM
	REM Check args
	REM
	if "%1"=="" (echo "Usage: sp_spaceused.bat SDFSDBS010\SQLDFS010 -dSIM -Uguest -Q sp_help " & goto _END)
	REM
	REM Set connection string
	REM
	set server=%1
	set db=%2
	set user=%3
	set passwd=%4
	set constr=osql -S  %1  -d  %2  -U  %3  -P  %4  -w5000 
	REM echo %constr%
	REM
	REM Get user table list & create sql string
	REM
	%constr% -Q "sp_help" | gawk "$1 !~ /^sys/" | gawk "$3 == \"user\"" | gawk "{printf \"exec sp_spaceused \"} {print $1} END { printf \"GO\"} " > tmp.bat
	REM
	REM Exec sp_spaceused
	REM
	%constr% -i tmp.bat | gawk "$0 !~ /-------|^$|1>/ {print $3,$1}" | gawk "{if ($0 ~ /name/ ) { header=$0 } else { print $0 }} END { print header }" | sort /R
	:_END