*

AWK を思い出すためのメモ

公開日: : awk

処理方法

読み込まれたテキストを1行ごとに処理する。

書き方

パターン { アクション }
パターンに当てはまる場合、アクションが実行される。
パターンは省略でき、省略した場合すべての場合にアクションが実行される。

# NRは内部で設定されるので
# とりあえず呼び出せばOK
# 「NR」は現在読み込んでいる行数が入っている
NR == 1 { print "1行目です"}
ひとまず動くスクリプト

シェルスクリプトとして実行する。

#!/bin/bash
{
cat <<__EOT__
1-1 1-2 1-3
2-1 2-2 2-3
3-1 3-2 3-3
linux centos RedHat SUSE
__EOT__
} | awk 'NR == 1 { print "1行目は" $0 "です。"}'
組み込み変数等の使い方
#!/bin/bash
{
# 入力部分
cat <<__EOT__
1-1 1-2 1-3
2-1 2-2 2-3
3-1 3-2 3-3
linux centos awk sed
__EOT__
} | awk '
  # テキストを読み込む前に実行される.
  BEGIN {
    print "入力フィールドセパレータ(区切り文字)を「スペース」に設定します。"
    FS = " " 
    print "処理を開始します..."
  }

  # 現在読み込んでいる行が1行目だったら...
  NR == 1 {
    print ""
    print "///---以下の処理はパターン「NR == 1」 の場合に実行されています"
    print "-組み込み変数-"
    print "1行目の $0 は「" $0 "」レコード全体"
    print "1行目の $1 は「" $1 "」1フィールド目"
    print "1行目の $2 は「" $2 "」2フィールド目"
    print "1行目の $3 は「" $3 "」3フィールド目"
    print "1行目の $4 は「" $4 "」値がないフィールドがある場合4フィールド目"
  
    print "1行目の行数 NR は「" NR "」"
    print "フィールド数 NF は「" NF "」"
    print "入力フィールドセパレータ FS は「" FS "」デフォルトはスペース"
    print "出力フィールドセパレータ OFS は「" OFS "」デフォルトはスペース"
    print "入力レコードセパレータ RS は「" RS "」デフォルトは改行"
    print "入力フィールドセパレータ ORS は「" ORS "」デフォルトは改行"
    print "以上の処理は条件式「NR == 1」が true の場合に実行されています---///"
    print ""
    # next を実行すると以下のパターンマッチングを中止し次の行を読み込む.
    next
  }
  # パターンを省略すると必ずアクションが実行される.
  {
    # nextで飛ばされていない限り必ず実行される.
    print NR "行目の内容「" $0 "」" "インクリメント "n++
  }
  # テキスト全てを読み込み終わった後に実行される.
  END {
    printf("テキストは全%d行でした.\n", NR)
  }
'
検索と置換
#!/bin/bash
{
# 入力部分
cat <<__EOT__
1-1 1-2 1-3
2-1 2-2 2-3
3-1 3-2 3-3
linux centos RedHat SUSE
__EOT__
} | awk '
  BEGIN { 
  	print "処理を開始します..."
  	print ""
  	str1 = "l"
  	str2 = "centos"
  	str3 = "xxxxxx"
  	 }

  # 検索
  match( $1, "^" str1) {
    print "//---検索"
    print "match(s, r)はマッチする場合はマッチする位置、"
    print "マッチしない場合は「0」を返す"
    print "s は検索する文字列(正規表現)、r マッチさせたい文字列"
    print "マッチする位置は " match( $1, "^" str1) " です。"
    print "行頭に " str1 " がある行は " NR " 行目の " $0 " です。"
    print "---//"
    print ""
  }
  
  # 置換
  NR == 4 {
    print "//---置換"
    print "gsub(r, s [, t]) rは検索文字列(正規表現)、"
    print "sは置換えする文字列、"
    print "tは置換したい文字列で省略すると$0になる"
    print "検索文字列は " str2
    print "置き換えする文字列は " str3
    print "置換前の文字列は " $0 " です"
    gsub( str2, str3 )
    print "置換後の文字列は " $0 " です"
    print "---//"
    print ""
  }
  END {
    printf("テキストは全%d行でした.\n", NR)
  }
'
ファイルへの保存とawkへ変数の受渡し
#!/bin/bash
file="./tmp.txt"
echo "保存するファイルは ${file} "
{
# 入力部分
cat <<__EOT__
1-1 1-2 1-3
2-1 2-2 2-3
3-1 3-2 3-3
linux centos RedHat SUSE
__EOT__
} | awk --assign awk_file="$file" '
  # ファイルに保存する
  NR == 4 {
    print "置換前の文字列は " $0 " です">awk_file
    gsub( "linux", "xxxxx" )
    print "置換後の文字列は " $0 " です">>awk_file
  }

'
echo "ファイルファイルに書き込まれた内容は「"
cat $file
echo "」です"

関数はほかにもいろいろあるので詳しくは以下のページへ
参考
http://linuxjm.sourceforge.jp/html/GNU_gawk/man1/gawk.1.html
http://shellscript.sunone.me/awk.html

admax_area



関連記事

記事はありませんでした

admax_area



Message

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA


日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

admax_area



PAGE TOP ↑