📢 Webサイト閉鎖と移転のお知らせ
このWebサイトは2026年9月に閉鎖いたします。
新しい記事は移転先で追加しております。(旧サイトでは記事を追加しておりません)

166行目: 166行目:
|}
|}
</center>
</center>
<br><br>
== sedコマンドを使用したフィルタリング ==
==== フィルタとは ====
フィルタとは標準入力からデータを受け取り、そのデータを加工した上で標準出力に出力する機能のことである。<br>
この機能には、主に、sed、awk、tr、grep等のコマンドが使用され、それらのコマンドに|(パイプ)でデータを受け渡すことでフィルタ機能を実現する。<br>
(例: パイプを使用して不必要な文字列を消去する処理や適切な位置に文字列を付加する処理)<br>
<br>
以下のような処理には、フィルタを使用すると効率的に作業ができる。<br>
* コマンドの実行結果から、次のコマンドのパラメータを生成する。
* あるファイルを決まったパターンで編集する。
* 膨大な文字数のログファイル内から必要な情報のみを抜き出す。
<br>
パイプでフィルタに加工するデータを受け渡し、目的とする文字列を抽出するフィルタリングを行う。<br>
フィルタをパイプで複数連結することで、より複雑なフィルタリング処理を実現することができる。<br>
command | filter
command | filter1 | filter2
command | filter1 | ... | filterN
<br>
==== 文字列Aを文字列Bに置換する ====
sedコマンドは様々な機能を持つコマンドであるが、主に、文字列の置換処理に利用されるコマンドである。<br>
<br>
置換処理を行う場合、置換対象と置換後の文字列を指定してコマンドを実行する。<br>
置換対象の指定には、正規表現を使用することも可能である。<br>
<u>ただし、一部の正規表現は使用できない。また、sedのバージョン等により、使用できる正規表現も異なる。</u><br>
<br>
各行の最初に一致した文字列のみ置換する。<br>
sed -e 's/パターン1/パターン2/'  # 各行の最初に一致したパターン1をパターン2に置換する
<br>
gの指定が無い場合、各行の最初に一致した文字列のみが置換対象となる。<br>
同一行内に複数の一致があった場合でも、2つめ以降の一致した文字列は置換されない。<br>
echo "hogehoge" | sed -e 's/hoge/fuga/'  # 文字列"hogehoge"の"hoge"を"fuga"に置換する
                                          # 実際に置換されるのは、先頭の"hoge"のみ
fugahoge
<br>
一致したすべての文字列を置換するには、g(globally)を指定する。<br>
sed -e 's/パターン1/パターン2/g'  # sedコマンドの置換パターンにgを指定する
<br>
gを指定すると各行の最初に一致した文字列のみではなく、すべての一致する文字列を置換対象とする。<br>
echo "hogehoge" | sed -e 's/hoge/fuga/g'  # gを指定して実行することで、全ての"hoge"が"fuga"に置換される
fugafuga
<br>
アルファベットの大文字小文字を区別しない。<br>
sed -e 's/パターン1/パターン2/i'  # iを指定することで大文字小文字の区別を行わない
<br>
iを指定する場合、アルファベットの大文字小文字を区別しない置換処理を行う。<br>
例えば、パターン1に"a"を指定する時、"a"と"A"が置換対象となる。<br>
echo "HogeHoge" | sed -e 's/hoge/fuga/i'  # iを指定することで、大文字小文字を区別することなく置換処理が行われる
fugaHoge
echo "HogeHoge" | sed -e 's/hoge/fuga/gi'  # 上記のように、iとgを同時に指定することもできる
fugafuga
<br>
複数パターンの置換を連続して行うには、-eオプションで複数の置換パターンを連結して指定する。<br>
sed -e 's/パターン1/パターン2/' -e 's/パターン3/パターン4/'
<br>
以下の例では、各行最初に一致したパターン1をパターン2に置換後、<br>
さらにパターン3をパターン4に置換するといった複数の置換を連続して実行している。<br>
echo "hogehoge fugafuga" | sed -e 's/hoge/foo/g' -e 's/fuga/bar/g'  # "hoge"を"foo"に置換した後、さらに、"fuga"を"bar"に置換する
foofoo barbar
echo "hogehoge fugafuga" | sed -e 's/hoge/foo/g' -e 's/fuga/bar/g' -e 's/ /-/g'  # 上記に加えて、スペースをハイフンに置換する
foofoo-barbar
echo "hoge" | sed -e 's/hoge/fuga/' -e 's/fuga/foo/' -e 's/foo/bar/'  # "hoge"を次々に置換して、最終的に"bar"にしている
bar
<br>
パターン指定の区切り文字を変更する。<br>
パターン指定の区切り文字には、任意の文字を使用することができる。<br>
<br>
<u>sedコマンドは、sの直後に指定した文字を区切り文字として認識するため、使用する区切り文字は/(スラッシュ)でなくともよい。</u><br>
特に /自体がパターンに含まれる場合は、/の代わりに%や|等を区切り文字に使用すると、/をエスケープする必要がなくなる。<br>
これは、大変便利なテクニックであるため、是非覚えておくこと。<br>
sed -e 's%パターン1%パターン2%'
sed -e 's|パターン1|パターン2|'
sed -e 's:パターン1:パターン2:'
<br>
以下の例では、/を区切り文字にする場合、/がパターンに含まれる場合はエスケープする必要がある。<br>
これを、/以外の区切り文字に変更して実行している。(可読性の面で、大変有利である)<br>
echo "hoge/hoge" | sed -e 's/hoge\/hoge/fuga\/fuga/'
fuga/fuga
echo "hoge/hoge" | sed -e 's%hoge/hoge%fuga/fuga%'
fuga/fuga
echo "hoge/hoge" | sed -e 's|hoge/hoge|fuga/fuga|'
fuga/fuga
echo "hoge/hoge" | sed -e 's:hoge/hoge:fuga/fuga:'
fuga/fuga
<br>
単一置換パターン指定であれば、-eオプションは省略できる。<br>
sed 's/パターン1/パターン2/'
<br>
複数の置換パターンを指定しない場合は、-eオプションは省略できる。<br>
ただし、省略しても問題なく機能するが、後から他のパターンを追加するような場合もあるので、常に指定することを推奨する。<br>
echo "hoge" | sed 's/hoge/fuga/'
fuga
<br>
==== 文字列の削除 ====
特定の文字列を削除するには、置換後のパターンに空文字を指定する。<br>
これにより、置換対象パターンと一致する文字列は空文字に置換されるため、結果的に削除と同等の処理となる。<br>
<br>
各行の最初に一致したパターンを削除する。<br>
sed -e 's/パターン//'
<br>
全てのパターンを削除する。<br>
sed -e 's/パターン//g'  # 置換後の文字列を指定しないことで削除処理になる
<br>
文字列の削除も置換処理と同じなので、通常の置換処理と使い方はまったく同じである。<br>
echo "hoge-fuga foo-bar" | sed -e 's/-//'  # gを指定していないため、最初に一致した文字のみ削除される
hogefuga foo-bar
echo "hoge-fuga foo-bar" | sed -e 's/-//g'  # gを指定すると、全ての一致する文字列が削除される
hogefuga foobar
<br><br>
<br><br>


__FORCETOC__
__FORCETOC__
[[カテゴリ:CentOS]][[カテゴリ:SUSE]][[カテゴリ:Raspberry_Pi]]
[[カテゴリ:CentOS]][[カテゴリ:SUSE]][[カテゴリ:Raspberry_Pi]]