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

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

カテゴリ: Linuxコマンド

vimコマンドとGNU GLOBALというツールを組み合わせて、Linux環境でのエディタ環境を構築します。
GNU GLOBALと組み合わせると、関数ジャンプや関数呼び出し一覧表示やジャンプができるようになり、ソースコードの解析が早くなります。
また、Linux環境でのエディタの使い方を覚えることで、解析以外の作業の効率化にも繋がります。
例えば、Linux系OSのサーバにあるコードの解析をする時、わざわざWindowsのローカルマシンにソースをコピーして、グラフィカルなエディタで解析をしている場合、
サーバからソースをダウンロード・アップロードする手間・時間が省かれ、サーバ上でソースを編集してすぐ実行できるようになります。

この記事では、環境構築と、使い方をまとめます。

環境構築:
1. vimコマンドのインストール
2. GNU GLOBALのソースコードをダウンロード(https://www.gnu.org/software/global/
3. GNU GLOBALのソースコードをmake(configureしてmake)
4. 「3」でできたglobalとgtagsをホームディレクトリのbin(~/bin)にコピー(パスが通っている場所ならどこにコピーしても問題なし)
5. 「3」でできたgtags.vimを~/.vim/plugin(無いならディレクトリを作成)へコピー 

初期設定(.vimrc):
.vimrcの設定は以下にする(あくまで私の設定です。慣れたらカスタマイズしましょう)
*先頭の数字は行番号なので無視してください
  1 map <C-h> :Gtags -f %<CR> ←関数一覧表示
  2 map <C-j> :GtagsCursor<CR> ←関数定義へジャンプ
  3 map <C-n> :cn<CR> ←関数呼び出しなどの別ウィンドウのリストで下に移動するため
  4 map <C-p> :cp<CR> ←関数呼び出しなどの別ウィンドウのリストで上に移動するため
  5 map <C-g> :Gtags ←Gtagsコマンド入力を楽にするため(後述の:Gtagsの入力をCtrl + gに置き換えることができます)
  6 set number ←常に行番号を表示するため

コマンド使い方: 
vim + GNU GLOBALコマンド一覧
コマンド説明
gtags -v解析するソースのトップディレクトリで実行する。これをしないと関数ジャンプができない。なお、vimでのコマンドではなく、vimコマンド実行前の前準備。
Ctrl + j関数定義へジャンプ。定義で使うと呼び出し一覧表示
Ctrl + oジャンプ元へ戻る
Ctrl + iジャンプ元へ戻るを戻る
Ctrl + n関数一覧などの別ウィンドウのリストの下へ移動
Ctrl + p関数一覧などの別ウィンドウのリストの上へ移動
Ctrl + h現在のファイルの関数一覧
G最終行へジャンプ
yyカーソル行をコピー
pペースト
uアンドゥ
*カーソル位置の単語を下へ検索
#カーソル位置の単語を上へ検索
n次の候補へ移動
N前の候補へ移動
:数字数字の行数へジャンプ
:Gtags 関数名関数ジャンプ
:Gtags -r 関数名関数呼び出し一覧
:Gtags -g 文字列文字列をgrep
スポンサードリンク
このエントリーをはてなブックマークに追加
スポンサードリンク

grepコマンドで、テキストエディタ等でよくするgrep指定をする方法です。

コマンド書式:
grep -nr --include=読み込むファイル名 "検索文字列" 検索するディレクトリ

例) 
grep -nr --include=*.c "return 1" ./MyProject

解説:
例では、"return 1"という文字列を、カレントディレクトリにあるMyProjectフォルダ以下にある、拡張子が.cのファイルの中から検索します。結果に、マッチしたファイル名と行だけではなく、行番号も出力します。

結果例:
./MyProject/grep_test/greptest.c:1:return 1;

-nオプションで検索文字列が含まれるファイルの行番号を表示します
-rオプションで指定したディレクトリを再帰的に検索します
--include=オプションで検索対象とするファイルパターンを指定します。正規表現が可能です。複数パターンを指定する場合は--include=を複数指定します。 

なお、結果のファイル名や行番号はコロン「:」で区切られるため、awkなどで整形することも容易です。 
このエントリーをはてなブックマークに追加

スクリプト等でサーバーからファイルを取得する際、パスワードを訊かれて処理を止めないようにする方法です。
scpコマンドと公開鍵認証方式を使います。

前提:
sshがインストール済みであること。
未インストール場合はこちらの記事を参考にサーバー・クライアント両方にインストールしておいてください。

公開鍵認証方式でファイルコピーするための準備:
 ssh-keygen -t rsa ←色々訊かれるが、パスワード無しにする場合は全てエンター
 ssh-copy-id -i ~/.ssh/id_rsa.pub コピー相手のアカウント名@コピー相手のIPアドレス ←公開鍵をクライアントへコピー(*1

*1 ssh-copy-idコマンドがインストールされていない場合は、手動で公開鍵を相手サーバに送ります。
  方法:相手サーバのアカウントの~/.ssh/authorized_keysに、
  ssh-keygenで作成した~/.ssh/id_rsa.pubの内容をコピー&ペースト

上記の操作を、コピーする相手同士でそれぞれ実施します。
つまり、公開鍵を教えあいます。(*2)

*2 単方向でしか通信しない場合(例えば片方のサーバー側からscpでファイルを持ってくるor送信するだけで、相手サーバー側からは何もしない場合)、通信される側のサーバーは、公開鍵を相手に送る必要はありません。

ファイルコピー操作(持ってくる方向):
scp コピー元アカウント名@コピー元IPアドレス:コピー元ファイル名 コピー先ファイル名 
例)
scp test_user1@192.168.xxx.xxx:~/scptest.txt .

例では、通信相手サーバー192.168.xxx.xxxのtest_user1アカウントから見たパスの~/scptest.txtを、scpコマンドを実行したサーバーのカレントディレクトリに取得します。
パスワードを訊かれずにファイルが取得できれば成功です。
コピーする方向を逆にする場合(送る方向)は、赤い部分と黄色い部分の引数を逆にするだけです。
scpコマンドは以下のように、cpコマンドと同様「コピー元」「コピー先」の順番で指定すると覚えましょう。

scp コピー元 コピー先
 
このエントリーをはてなブックマークに追加

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

変更対象のファイル: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って便利ですが、しばらく使ってないと使い方わからなくなる典型ですよね。オプションに色々指定しなきゃいけないので。
備忘録も兼ねて書いてます。
 
このエントリーをはてなブックマークに追加

↑このページのトップヘ