sed

unix系には入っているテキスト処理の仕組みで、パターンスペースで処理を行います。

[vagrant@localhost sed]$ sed --version
GNU sed 4.2.1版

Copyright (C) 2009 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE,
to the extent permitted by law.

GNU sed home page: .
General help using GNU software: .
E-mail bug reports to: .
Be sure to include the word ``sed'' somewhere in the ``Subject:'' field.

sedコマンド

[vagrant@localhost sed]$ sed -e '3d' names.text
1 yamada
2 yokoi
4 hirose
5 inui

バックアップを作成し、元ファイルを上書き

[vagrant@localhost sed]$ sed -i.bak '3d' names.text
[vagrant@localhost sed]$ cat names.text.bak
1 yamada
2 yokoi
3 sakamoto
4 hirose
5 inui

コマンドファイルの作成

[vagrant@localhost sed]$ vi ex1.sed
[vagrant@localhost sed]$ sed -f ex1.sed names.text
1 yamada
2 yokoi
4 hirose
5 inui

アドレスの種類


[vagrant@localhost sed]$ sed '3d' names.text
1 yamada
2 yokoi
4 hirose
5 inui
[vagrant@localhost sed]$ sed '!3d' names.text
sed: -e 表現 #1, 文字数 2: 未知のコマンドです: 「3」
[vagrant@localhost sed]$ sed '3!d' names.text
3 sakamoto
[vagrant@localhost sed]$ sed '1d;3d' names.text
2 yokoi
4 hirose
5 inui
[vagrant@localhost sed]$ sed '1,3d' names.text
4 hirose
5 inui
[vagrant@localhost sed]$ sed '1~2d' names.text
2 yokoi
4 hirose
[vagrant@localhost sed]$ sed '$d' names.text
1 yamada
2 yokoi
3 sakamoto
4 hirose

追加コマンド

[vagrant@localhost sed]$ sed '3p' names.text
1 yamada
2 yokoi
3 sakamoto
3 sakamoto
4 hirose
5 inui
[vagrant@localhost sed]$ sed -n '3p' names.text
3 sakamoto
[vagrant@localhost sed]$ sed '3q' names.text
1 yamada
2 yokoi
3 sakamoto
[vagrant@localhost sed]$ sed '1i\--start--' names.text
--start--
1 yamada
2 yokoi
3 sakamoto
4 hirose
5 inui
[vagrant@localhost sed]$ sed '1i\--start --' -e '$a\-- end --' names.text
1 yamada
2 yokoi
3 sakamoto
4 hirose
5 inui
-- end --

Yコマンドによる置換

[vagrant@localhost sed]$ sed 'y/y/Y/' names.text
1 Yamada
2 Yokoi
3 sakamoto
4 hirose
5 inui
[vagrant@localhost sed]$ sed 'y/yo/YO/' names.text
1 Yamada
2 YOkOi
3 sakamOtO
4 hirOse
5 inui

sコマンドで文字列の置換、フラグgですべての文字列を置換します。&の置換もあります。
sed ‘s/\([-5]\) \(.*\)/\2’items.text

ホールドスペースとは、パターンスペースの裏バッファのようなものです。
h:hold -> パターンスペースをホールドスペースに
g:get -> ホールドスペースからパターンスペースに
x:exchange -> パターンスペースとホールドスペースを交換

awk2

条件式

{
  print NR ":" $0
  if (NR % 5 == 0){
   print "--------"
  }
}

forループ

{
 print("%-12s %5d", $1, $3)

 for (i = 0; i < int($3/10); i++){
 printf("*")
 }
 printf("\n")
}

配列

BEGIN{
  sales[1] = 200
  sales[2] = 120
  sales[3] = 50
  print sales[3]

  color = "yellow red blue"
  split(color, colors)
  print colors[3]
}

配列

{
  sales[$1] += $3
}
END {
  for (name in sales){
   print name ":" sales[name]
  }
}

関数の作り方

function getRate(n){
  return int(n / 100) * 0.1
}

{
printf("%-12s %5d rate:%0.1f\n", $1, $3, getRate($3))
}

awk

awkは効率的にテキスト処理を行うことができます。

[vagrant@localhost awk]$ awk --version
GNU Awk 3.1.7
Copyright (C) 1989, 1991-2009 Free Software Foundation.

This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 3 of the License, or
(at your option) any later version.

本プログラムは、利用価値があることを期待して配布されていますが、
これは、特定目的に使用可能であること、及び、商用目的に使用できる
ことを暗示するものではなく、いかなる保証も一切ありません。
詳しくは、GNU General Public License を参照してください。

You should have received a copy of the GNU General Public License
along with this program. If not, see http://www.gnu.org/licenses/.
{ print $3 }
[vagrant@localhost awk]$ awk -f ex1.awk sales.dat

コマンドラインで、1行で表すこともできます。
awk ‘{print $3}’ sales.dat

行番号の表示

{
print NR ":" $0
}

パターン

NR < 5{
  print NR ":" $0
}

NR > 10{
  print NR ":" $0
}

FS

BEGIN{
 print "--start --"
 FS = "-"
}
{
 print $1
}
NR < 5{
  # print NR ":" $0
}

NR > 10{
  # print NR ":" $0
}
END {
  print "-- end --"
}

条件

(NR == 5) || (NR > 10){
  print NR ":" $0
}

正規表現

$2 ~ /item-[23]/ {
 print $0
}

printとprintfの違い

{
 printf("%s %d\n", $1, $3)
}

表示を整理

{
 printf("%-10s %5d\n", $1, $3)
}

変数

BEGIN{
  sum = 0
}
{
 sum = sum + $3
}
END{
  print sum
}

組み込み関数

{
  printf("%f, %d\n", rand(), int($3/3))
}