[
トップ
] [
新規
|
一覧
|
単語検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
#menu(howto/MenuBar)
* howto/sedとawk [#bd7cb851]
#contents
** 一行メモ [#s4b48f6e]
- 補足:sedやawkのコマンドやプログラムは ' で括られている...
- sed -n '1p;2,${/idle/p}' #1行目は表示し、2行目から...
#comment
//-------------------------------------------------------...
* sed [#s4663b86]
sedは入力ファイル(無ければ標準入力)に対して、各行ごとに...
編集された行を標準出力に書き出すストリームエディタである。
ホールドスペースを使うと2行以上に渡って編集することもで...
sed [オプション] コマンド [ファイル]~
のように実行する。
** 基本的な例 [#b6a9ffab]
*** 置換 s [#z3e5c761]
sed 's/foo/bar/' file.txt
各行の最初の fooを barに置換する。この時のコマンドは sで...
行に複数ある fooをすべて barに置き換えるには 's/foo/bar/g...
*** 範囲指定 [#tc932b9e]
sed '2,5s/foo/bar/' file.txt
sed '2s/foo/bar/' file.txt
のようにコマンドの前に範囲を指定することもでき、
2,5sで2行目から5行目を、2sで2行目のみを置換することが...
2,$sとすると2行目から最後の行までを指定できる。
sed '/chap1/,/chap2/s/foo/bar/' file.txt
数字以外にも /chap1/,/chap2/とすると chap1を含む行から ch...
sed '/chap1/s/foo/bar/' file.txt
の場合は chap1を含む行のみを指定して、コマンドsを実行して...
範囲指定には '2,5!s/foo/bar/' や '/chap1/!s/foo/bar/'のよ...
2行目から5行目以外や chap1を含む行以外を指定することも...
*** 複数のコマンド [#gbe84149]
コマンドは ;で区切って複数与えることができる。そのコマン...
{ }で括ることもできる。
sed '2,5s/chap/bar/; 2,5s/bar/foo/' file.txt
sed '2,5{s/chap/bar/; s/bar/foo/}' file.txt
*** タブの利用 [#tafebbf6]
sed '2,5{s/,/\t/g; s/calc/foo/}'
のようにタブ文字に関する置換は 's/,/\t/g' のように \tを使...
なお、bashの場合は Ctrl-v Tab でタブの文字コードを入力で...
*** 正規表現 [#c7410216]
検索文字列としては正規表現も利用可能である。
行頭と行末の一致はそれぞれ ^と $である。
例えば、CPUがサポートしている機能の一覧を作りたいときは(...
cat /proc/cpuinfo | sed -n '/^flags.*: /p' | sed -n 1p \
| sed 's/^flags.*://; s/ /\n/g' | sort
\( \)で検索文字列を括ると、括った順番に \1や \2で置換後...
cat /proc/cpuinfo | grep address | sed 's/^\(.*\) \(.*\)...
は address sizes を sizes addressに置き換えている。
*** 表示 p [#c7eb1dca]
指定した範囲だけを表示するには
sed -n '2,5p' file.txt
とする。
通常、1行ずつ読み込んでコマンド実行した結果の行を出力す...
明示的に表示コマンドpを使わない限り表示しない。
従って、-nを付けておいて、2,5に対してコマンドpを実行する...
*** 追加 a, i [#ub4b2598]
sed '2aNEW-LINE' file.txt #2行目にNEW-LINEという行を...
sed '2iNEW-LINE' file.txt #2行目の前にNEW-LINEという...
*** 削除 d [#y1f4528f]
sed '4d' file.txt #4行目を削除する
** 練習問題 [#ob1f4d22]
(1) echo $PATH | sed 's/:/\n/g' は何をしているか?
(2) /proc/cpuinfoをもとに、CPUのモデル名と動作クロックの...
(3) /bin/ls -l の出力をもとに sedでファイル名と時刻(また...
//-------------------------------------------------------...
** 詳細 [#ndf8620a]
*** 簡易マニュアル [#g12d8905]
入力は行ごとにパターンスペースに入れられ(末尾の改行は削...
出力される(改行は追加される)。一時的な保存場所であるホ...
利用できる。-nオプション付きの場合、下記のpコマンドで出力...
コマンド
s/検索文字列/置換後文字列/オプション 文字列の置換(...
オプション
g 置換を最後まで行う(g無いときは1回だ...
検索文字列
. 任意の文字
* 直前の文字の0個以上の繰り返し(.*で...
^ 行頭
$ 行末
\(...\) 括弧でくくった部分は、置換後文字列と...
\| または
d 削除(パターンスーペース内)
p 出力する(パターンスペース内)、sed -n で実行した...
G ホールドスペースの内容をパターンスペースに追加(...
h パターンスペースの内容をホールドスペースにコピー
g ホールドスペースの内容をパターンスペースにコピー
H パターンスペースの内容をホールドスペースに追加(...
N 次の入力行をパターンスペースに追加
b [label] labelに分岐する。labelが無ければ末尾に分...
= 行番号を出力する(改行つき)
上記コマンドの前には対象を指定できる
/検索文字列/[!] 検索文字列を含む行を対象、!があ...
行番号[,行番号][!] 入力の行番号(から行番号)の行を...
$は最終行の行番号
;で区切ってコマンドを複数書ける。
{}でコマンドをくくって複数書ける。
例)
sed '1,/^$/d' hogefile #1行目から、2行目以降の空行ま...
sed -n '/GB/p' hogefile #これは grep GB hogefile と同じ...
sed -n '1,2p; /GB/{s/pot/Pot/; s/:/=\t/; p}'
sed -n '1,2{=; p}; /GB/{s/0/a/; N; N; =; p}' #あまり意...
E表現の数値を小数点以下4桁に切り捨てる例)
sed 's/\(-\?[0-9]\.\|-\?\.\)\([0-9]\{4\}\)\([0-9]*\)\...
sed -r 's/(-?[0-9]\.|-?\.)([0-9]{4})([0-9]*)([eEdD][+-]?...
filename内の継続行(バックスラッシュ'\'とこれに続く改行'\...
sed ':a;N;$!ba;s/\\\n//g' filename
(説明)
:a で aというラベルを定義しておく。
N で次の行をパターンスペースに追加し、
$! で最後の行以外の行に対して、次のコマンド(ba)を実行...
最後の行のときにパターンスペース(全ての行が含まれる)に...
[ref] https://qiita.com/gin_135/items/773fec1343a69c9f90d...
man sed も見よ
*** 拡張正規表現 ( sed -r ) [#q456fe3b]
\(, \), \{, \}, \? などは (, ), {, }, ? などと表記する。
その他に使える表現が増える。
//-------------------------------------------------------...
* awk [#nd8337aa]
awkは入力ファイル(無ければ標準入力)に対して、各行ごとに...
標準出力に書き出すという、パターン検索・処理言語である。
sedよりも柔軟でC言語と似ている。開発者Aho, Weinberger, Ke...
awk [オプション] プログラム [ファイル]~
のように実行する。プログラムの部分は~
パターン { アクション }~
の羅列である。
** 基本的な例 [#faab7db7]
*** 表示 [#vf7f3181]
awk '/foo/ { print }' file.txt
文字列fooがある行を表示する。引数無しの printだけだと行全...
awk '{ print $1 }' file.txt
1列目だけを表示する。パターンを与えていないのですべての...
デフォルトで列は空白(タブやスペース)で区切られている。-...
$1, $2, $3, ...はそれぞれ1列目, 2列目, 3列目, ...を表...
NFは列の数、NRは行番号の変数として使える。
awk '{ print NR, $1, $1, "==>", NF }' file.txt
これは読み込んだ各行について、行番号、1列目、1列目、文...
ファイルサイズとファイル名を表示する例
/bin/ls -l | awk '{print $5, "\t", $9}'
/bin/ls -l | awk '{printf "%20s%20s\n", $5, $9}'
C言語と同様の組み込み関数printfを使って整形表示することも...
OSに登録されているユーザー名とログインシェルを表示する例
awk -F: '{print $1,"\t",$7}' /etc/passwd
*** 算術演算 [#wc53365d]
1列目の合計と平均を計算する。
awk '{sum += $1} END {print sum, sum/NR}' file.txt
変数(ここではsum)は初めてプログラムに現れた時に、自動的...
sum += $1 は sum = sum + $1 としてもよい。C言語と同様の二...
このプログラムでは、各行について {sum += $1}が実行される。
END { } は、すべての行について実行し終わったとき、最後に...
各行の実行の前に、最初に一度だけ実行する BEGIN { } とい...
$1などや変数の値が、数値であるか文字であるかの判断は自動...
awk '{nc += length($0); nw += NF} END {print NR, nw, nc}...
このプログラムは行数、単語数、文字数をカウントして表示し...
組み込み関数lengthは文字数を与える。
awk '{nc += length($0); nw += NF} END {print nc/nw}' fil...
は単語の平均的な文字数を計算している。
nc/nwを int(nc/nw)すれば小数点以下を切り捨てて整数値を得...
find . -path '*.c' -printf "%p\t%s\n" | awk '{sum+=$2} E...
はカレントディレクトリ以下の拡張子.cのファイルサイズの和...
find . -path '*.c' -exec wc {} \; | awk '{sum+=$1} END{...
はカレントディレクトリ以下の拡張子.cのファイルの行数の和...
Linuxコマンドfindとwcの説明はここでは略。
*** フロー制御 [#e879c582]
if ( 条件 ) 文1; else 文2~
for ( 式1; 条件; 式2 ) 文~
for ( 変数 in 配列 ) 文~
while ( 条件 ) 文~
も使える。配列を使う例は下記の[[配列>#lb1c0f15]]を参照の...
文のところは中括弧で括って { 文1; 文2; 文3 }のようにもで...
1列目がfooという文字列のとき、2列目を出力するには
awk '{ if ( $1 == "foo" ) print $2 }' file.txt
これは
awk '$1 == "foo" { print $2 }' file.txt
と同じ結果を与える。
各行について行番号を表示したのち、列の項目をひとつずつ表...
awk '{ print "====", NR, "===="; \
for ( i=1; i<=NF; i++) print $i, "<--", NF }' file.txt
*** 配列 [#lb1c0f15]
度数分布を作成する。binは区間の幅である。(注) 区間に0個...
awk 'BEGIN{ bin=2.0 } \
{ f[ int($1/bin) ]++ } \
END{ for( i in f ) print i*bin, f[i] }' file.txt
単語の数をカウントする。
awk '{for (i=1; i<=NF; i++ ) num[$i]++} \
END { for ( word in num ) print word, num[word] }' fil...
この配列の添え字は整数ではなく文字列である(配列の添え字...
いわゆる連想配列である)。
** 練習問題 [#n426f7f2]
(1) 1列目と2列目に数値が並んでいるファイルがあるとしま...
2列目が最大値である行を表示する awkプログラムはどう作る...
(なお、最大値が複数ある場合は最初の行だけを表示するだけ...
** 統計屋のためのAWK入門 [#e3641dcd]
http://antibayesian.hateblo.jp/entry/2014/09/15/162605
//-------------------------------------------------------...
終了行:
#menu(howto/MenuBar)
* howto/sedとawk [#bd7cb851]
#contents
** 一行メモ [#s4b48f6e]
- 補足:sedやawkのコマンドやプログラムは ' で括られている...
- sed -n '1p;2,${/idle/p}' #1行目は表示し、2行目から...
#comment
//-------------------------------------------------------...
* sed [#s4663b86]
sedは入力ファイル(無ければ標準入力)に対して、各行ごとに...
編集された行を標準出力に書き出すストリームエディタである。
ホールドスペースを使うと2行以上に渡って編集することもで...
sed [オプション] コマンド [ファイル]~
のように実行する。
** 基本的な例 [#b6a9ffab]
*** 置換 s [#z3e5c761]
sed 's/foo/bar/' file.txt
各行の最初の fooを barに置換する。この時のコマンドは sで...
行に複数ある fooをすべて barに置き換えるには 's/foo/bar/g...
*** 範囲指定 [#tc932b9e]
sed '2,5s/foo/bar/' file.txt
sed '2s/foo/bar/' file.txt
のようにコマンドの前に範囲を指定することもでき、
2,5sで2行目から5行目を、2sで2行目のみを置換することが...
2,$sとすると2行目から最後の行までを指定できる。
sed '/chap1/,/chap2/s/foo/bar/' file.txt
数字以外にも /chap1/,/chap2/とすると chap1を含む行から ch...
sed '/chap1/s/foo/bar/' file.txt
の場合は chap1を含む行のみを指定して、コマンドsを実行して...
範囲指定には '2,5!s/foo/bar/' や '/chap1/!s/foo/bar/'のよ...
2行目から5行目以外や chap1を含む行以外を指定することも...
*** 複数のコマンド [#gbe84149]
コマンドは ;で区切って複数与えることができる。そのコマン...
{ }で括ることもできる。
sed '2,5s/chap/bar/; 2,5s/bar/foo/' file.txt
sed '2,5{s/chap/bar/; s/bar/foo/}' file.txt
*** タブの利用 [#tafebbf6]
sed '2,5{s/,/\t/g; s/calc/foo/}'
のようにタブ文字に関する置換は 's/,/\t/g' のように \tを使...
なお、bashの場合は Ctrl-v Tab でタブの文字コードを入力で...
*** 正規表現 [#c7410216]
検索文字列としては正規表現も利用可能である。
行頭と行末の一致はそれぞれ ^と $である。
例えば、CPUがサポートしている機能の一覧を作りたいときは(...
cat /proc/cpuinfo | sed -n '/^flags.*: /p' | sed -n 1p \
| sed 's/^flags.*://; s/ /\n/g' | sort
\( \)で検索文字列を括ると、括った順番に \1や \2で置換後...
cat /proc/cpuinfo | grep address | sed 's/^\(.*\) \(.*\)...
は address sizes を sizes addressに置き換えている。
*** 表示 p [#c7eb1dca]
指定した範囲だけを表示するには
sed -n '2,5p' file.txt
とする。
通常、1行ずつ読み込んでコマンド実行した結果の行を出力す...
明示的に表示コマンドpを使わない限り表示しない。
従って、-nを付けておいて、2,5に対してコマンドpを実行する...
*** 追加 a, i [#ub4b2598]
sed '2aNEW-LINE' file.txt #2行目にNEW-LINEという行を...
sed '2iNEW-LINE' file.txt #2行目の前にNEW-LINEという...
*** 削除 d [#y1f4528f]
sed '4d' file.txt #4行目を削除する
** 練習問題 [#ob1f4d22]
(1) echo $PATH | sed 's/:/\n/g' は何をしているか?
(2) /proc/cpuinfoをもとに、CPUのモデル名と動作クロックの...
(3) /bin/ls -l の出力をもとに sedでファイル名と時刻(また...
//-------------------------------------------------------...
** 詳細 [#ndf8620a]
*** 簡易マニュアル [#g12d8905]
入力は行ごとにパターンスペースに入れられ(末尾の改行は削...
出力される(改行は追加される)。一時的な保存場所であるホ...
利用できる。-nオプション付きの場合、下記のpコマンドで出力...
コマンド
s/検索文字列/置換後文字列/オプション 文字列の置換(...
オプション
g 置換を最後まで行う(g無いときは1回だ...
検索文字列
. 任意の文字
* 直前の文字の0個以上の繰り返し(.*で...
^ 行頭
$ 行末
\(...\) 括弧でくくった部分は、置換後文字列と...
\| または
d 削除(パターンスーペース内)
p 出力する(パターンスペース内)、sed -n で実行した...
G ホールドスペースの内容をパターンスペースに追加(...
h パターンスペースの内容をホールドスペースにコピー
g ホールドスペースの内容をパターンスペースにコピー
H パターンスペースの内容をホールドスペースに追加(...
N 次の入力行をパターンスペースに追加
b [label] labelに分岐する。labelが無ければ末尾に分...
= 行番号を出力する(改行つき)
上記コマンドの前には対象を指定できる
/検索文字列/[!] 検索文字列を含む行を対象、!があ...
行番号[,行番号][!] 入力の行番号(から行番号)の行を...
$は最終行の行番号
;で区切ってコマンドを複数書ける。
{}でコマンドをくくって複数書ける。
例)
sed '1,/^$/d' hogefile #1行目から、2行目以降の空行ま...
sed -n '/GB/p' hogefile #これは grep GB hogefile と同じ...
sed -n '1,2p; /GB/{s/pot/Pot/; s/:/=\t/; p}'
sed -n '1,2{=; p}; /GB/{s/0/a/; N; N; =; p}' #あまり意...
E表現の数値を小数点以下4桁に切り捨てる例)
sed 's/\(-\?[0-9]\.\|-\?\.\)\([0-9]\{4\}\)\([0-9]*\)\...
sed -r 's/(-?[0-9]\.|-?\.)([0-9]{4})([0-9]*)([eEdD][+-]?...
filename内の継続行(バックスラッシュ'\'とこれに続く改行'\...
sed ':a;N;$!ba;s/\\\n//g' filename
(説明)
:a で aというラベルを定義しておく。
N で次の行をパターンスペースに追加し、
$! で最後の行以外の行に対して、次のコマンド(ba)を実行...
最後の行のときにパターンスペース(全ての行が含まれる)に...
[ref] https://qiita.com/gin_135/items/773fec1343a69c9f90d...
man sed も見よ
*** 拡張正規表現 ( sed -r ) [#q456fe3b]
\(, \), \{, \}, \? などは (, ), {, }, ? などと表記する。
その他に使える表現が増える。
//-------------------------------------------------------...
* awk [#nd8337aa]
awkは入力ファイル(無ければ標準入力)に対して、各行ごとに...
標準出力に書き出すという、パターン検索・処理言語である。
sedよりも柔軟でC言語と似ている。開発者Aho, Weinberger, Ke...
awk [オプション] プログラム [ファイル]~
のように実行する。プログラムの部分は~
パターン { アクション }~
の羅列である。
** 基本的な例 [#faab7db7]
*** 表示 [#vf7f3181]
awk '/foo/ { print }' file.txt
文字列fooがある行を表示する。引数無しの printだけだと行全...
awk '{ print $1 }' file.txt
1列目だけを表示する。パターンを与えていないのですべての...
デフォルトで列は空白(タブやスペース)で区切られている。-...
$1, $2, $3, ...はそれぞれ1列目, 2列目, 3列目, ...を表...
NFは列の数、NRは行番号の変数として使える。
awk '{ print NR, $1, $1, "==>", NF }' file.txt
これは読み込んだ各行について、行番号、1列目、1列目、文...
ファイルサイズとファイル名を表示する例
/bin/ls -l | awk '{print $5, "\t", $9}'
/bin/ls -l | awk '{printf "%20s%20s\n", $5, $9}'
C言語と同様の組み込み関数printfを使って整形表示することも...
OSに登録されているユーザー名とログインシェルを表示する例
awk -F: '{print $1,"\t",$7}' /etc/passwd
*** 算術演算 [#wc53365d]
1列目の合計と平均を計算する。
awk '{sum += $1} END {print sum, sum/NR}' file.txt
変数(ここではsum)は初めてプログラムに現れた時に、自動的...
sum += $1 は sum = sum + $1 としてもよい。C言語と同様の二...
このプログラムでは、各行について {sum += $1}が実行される。
END { } は、すべての行について実行し終わったとき、最後に...
各行の実行の前に、最初に一度だけ実行する BEGIN { } とい...
$1などや変数の値が、数値であるか文字であるかの判断は自動...
awk '{nc += length($0); nw += NF} END {print NR, nw, nc}...
このプログラムは行数、単語数、文字数をカウントして表示し...
組み込み関数lengthは文字数を与える。
awk '{nc += length($0); nw += NF} END {print nc/nw}' fil...
は単語の平均的な文字数を計算している。
nc/nwを int(nc/nw)すれば小数点以下を切り捨てて整数値を得...
find . -path '*.c' -printf "%p\t%s\n" | awk '{sum+=$2} E...
はカレントディレクトリ以下の拡張子.cのファイルサイズの和...
find . -path '*.c' -exec wc {} \; | awk '{sum+=$1} END{...
はカレントディレクトリ以下の拡張子.cのファイルの行数の和...
Linuxコマンドfindとwcの説明はここでは略。
*** フロー制御 [#e879c582]
if ( 条件 ) 文1; else 文2~
for ( 式1; 条件; 式2 ) 文~
for ( 変数 in 配列 ) 文~
while ( 条件 ) 文~
も使える。配列を使う例は下記の[[配列>#lb1c0f15]]を参照の...
文のところは中括弧で括って { 文1; 文2; 文3 }のようにもで...
1列目がfooという文字列のとき、2列目を出力するには
awk '{ if ( $1 == "foo" ) print $2 }' file.txt
これは
awk '$1 == "foo" { print $2 }' file.txt
と同じ結果を与える。
各行について行番号を表示したのち、列の項目をひとつずつ表...
awk '{ print "====", NR, "===="; \
for ( i=1; i<=NF; i++) print $i, "<--", NF }' file.txt
*** 配列 [#lb1c0f15]
度数分布を作成する。binは区間の幅である。(注) 区間に0個...
awk 'BEGIN{ bin=2.0 } \
{ f[ int($1/bin) ]++ } \
END{ for( i in f ) print i*bin, f[i] }' file.txt
単語の数をカウントする。
awk '{for (i=1; i<=NF; i++ ) num[$i]++} \
END { for ( word in num ) print word, num[word] }' fil...
この配列の添え字は整数ではなく文字列である(配列の添え字...
いわゆる連想配列である)。
** 練習問題 [#n426f7f2]
(1) 1列目と2列目に数値が並んでいるファイルがあるとしま...
2列目が最大値である行を表示する awkプログラムはどう作る...
(なお、最大値が複数ある場合は最初の行だけを表示するだけ...
** 統計屋のためのAWK入門 [#e3641dcd]
http://antibayesian.hateblo.jp/entry/2014/09/15/162605
//-------------------------------------------------------...
ページ名: