Linuxコマンド・bashの使い方実例

Linuxコマンド・bashの使い方の実例を紹介します。
管理人は現役ITエンジニアとして働いております(本業は組み込み系)。
かれこれ10年以上ITエンジニアとしてのキャリアを積んできました。
まだまだ未熟者ですが、皆さんのお役に立てたら幸いです。

タグ:sedコマンド

ちょっとした小ワザ(ってほどでもないのですが・・)、
特定のディレクトリ、あるいはファイルの、特定の行のみ出力する方法を記載します。 
下記のsedコマンドで、指定したファイルの指定した行を出力できます。 

sed -n [行数]p [ファイル名]

※-nオプションは、条件に含まれない行は出力させないオプションです。
※カッコ[]は含めないでください。

ディレクトリに含まれるファイル全てを対象に出力する場合は、
以下のようにfindコマンドと組み合わせます。

find [ディレクトリ] -type f -exec sed -n [行数]p {} ¥;

特定の拡張子のファイルを対象にする場合(例では拡張子が.c)、
findコマンドに-name '*.c'などのオプションでフィルターをかけることもできます。

find [ディレクトリ] -type f -name '*.c' -exec sed -n [行数]p {} ¥;

このようにgrepやfindやsedを組み合わせて使い慣れることで、
作業効率を格段に上げることができます。
Linux環境を使う方には必須のテクニックでしょう。 
スポンサードリンク
このエントリーをはてなブックマークに追加
スポンサードリンク

スクリプト等を変更する際、変更行をコメントアウトで残しておいて、
変更後の行を挿入することがよくあります。こういう時に便利なコマンドです。

変更対象のファイル:target.sh
#!/bin/bash
echo "-------teststart!!!-------"
echo "target1"
echo "target2"
echo "target3"
echo "-------testend!!!-------"
exit 0

変更後のファイル:target.sh

#!/bin/bash
echo "-------teststart!!!-------"
echo "target1"
echo "target4"
#echo "target2"
echo "target3"
echo "-------testend!!!-------"
exit 0
 
変更実行コマンド:
sed -e "/^echo \"target2/s/^/#/" -e "/^#echo \"target2/iecho \"target4\"" -i.bak target.sh

解説:
ピンク色の箇所がコメントアウト対象行。黄色の箇所が挿入行。
sedコマンドの1つ目の-eで実行しているコマンドは、
条件「echo "target2で始まる行」に当てはまる行の「行頭を#にする」という意味です。
正規表現で行頭は^と書きます。
sedコマンドで2つ以上コマンドを実行する場合はいくつか方法があります。
-eをその都度指定する。複数コマンドを{}で括る(その場合、各コマンドは;で区切る)。sedスクリプトファイルに記載する。等の方法があります。
2つ目のコマンドは、
条件「#echo \"target2で始まる行」に当てはまる行の前に「echo "target4"を挿入する」という意味です。

余談:
前にもsedコマンドの解説をしましたが、個人的にsedやawkとかエディタ系が好きなので今後も多くなりそうです。
このエントリーをはてなブックマークに追加

sedコマンドは文字列置換が便利です。
ストリームエディタ(つまりsedのこと)でも、複数行にまたがる置換ができます。
これを利用し、スクリプトから、別のスクリプトをカスタマイズする実例です。
スクリプトをアウトプットとする、スクリプト(ややこしい)の処理を作る時などに使えます。
 
置換対象スクリプト:target.sh
#!/bin/bash
echo "-------teststart!!!-------"
echo "target1"
echo "target2"
echo "target3"
echo "-------testend!!!-------"
exit 0

置換実行スクリプト:sedtest.sh
#!/bin/bash
sed -e "s/echo \"target2\"/if [ $? -eq 0 ]; then\n\techo \"success\"\nfi/g" -i.bak target.sh
exit

置換実行後スクリプト:target.sh
#!/bin/bash
echo "-------teststart!!!-------"
echo "target1"
if [ 0 -eq 0 ]; then
echo "success"
fi
echo "target3"
echo "-------testend!!!-------"
exit 0
 
解説:
ピンク色の部分が置換対象文字列。黄色の部分が置換後文字列。
エスケープシーケンス「\n」を使うことにより、複数行の文字列に置換することができます。
「\t」はタブです。echo文をif文に置換しているので、一応インデントを意識しました。
その他の「\」は「"」のエスケープです。
-i.bakは、sedコマンドのオプションです。「指定されたファイルを直接編集する。拡張子が指定されれば、その拡張子を付加してバックアップファイルを作成する。」という意味です。そのため、実行後はtarget.sh.bakというファイルがバックアップとして作成されます。
この-iオプションを知らないためか、直接編集したいのにわざわざ別ファイルに出力してコピーして置き換える処理とかたまに見ますけど、-iオプションを使ったほうがスマートです。

これにより、マスターのスクリプトを作っておいて、状況に応じて異なるスクリプトを出力するなんてことができます。

余談:
sedって便利ですが、しばらく使ってないと使い方わからなくなる典型ですよね。オプションに色々指定しなきゃいけないので。
備忘録も兼ねて書いてます。
 
このエントリーをはてなブックマークに追加

↑このページのトップヘ