Quantcast
Channel: Bashタグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 2820

Linux初心者がコマンドを使うときに知っておくと少し幸せになること

$
0
0

はじめに

最近周りでLinuxのBashを触る人が増え、意外と知られていないコマンドの使い方や、おしい所で詰まっているコマンドの記述を目にするようになってきたので、その中でもコマンド共通して参考になりそうなモノをピックアップして紹介します。

また、それぞれの詳細な説明は記事が沢山出ているので、ここでは紹介する程度に留めておきます。

LinuxでBashを触り始めて、なんとなくコマンドやパイプが使えるようになってきた人に、一歩踏み込んだ使い方として参考になれば幸いです。

・ショートカットが便利

Tabでの補完や、Ctrl+Cで実行したコマンドを中断する、↑↓で実行したコマンドの履歴を表示する以外にも、コンソール上で操作をするのに便利なキーボードショートカットが用意されています。

お勧めのショートカットとしては以下3つになりますが、これ以外にも色々なショートカットが用意されており、使いこなせれば操作効率が大きく改善されると思います。

  • Ctrl+R:過去に実行したコマンドの履歴を検索
  • Ctrl+A:カーソルの位置を先頭に移動
  • Ctrl+E:カーソルの位置を行末に移動

・コマンドの説明を表示できる

コマンドはわかるけど使い方を忘れてしまった...といった場合に、コマンドの説明をコンソール上で確認する事ができます。

代表的なのはmanコマンドで、引数にコマンドを指定して実行するとマニュアルを表示する事ができます。
標準ではlessコマンドでマニュアルが表示されるので、/(検索文字列)で文字列検索、↑↓で表示移動、qで表示を終了するなど、lessコマンドでできる操作がそのまま使用できます。
(英語が苦手な方は少し手間ですが、表示を日本語化する事もできます)

grepコマンドのマニュアルを表示
$ man grep

また、多くのコマンドでは-h–helpオプションをつけてコマンドを実行するとusage(使い方)を表示する事ができます。

grepコマンドのusageを表示
$ grep-h
usage: grep[-abcDEFGHhIiJLlmnOoqRSsUVvwxZ][-A num] [-B num] [-C[num]]
    [-e pattern] [-f file] [--binary-files=value] [--color=when]
    [--context[=num]] [--directories=action] [--label][--line-buffered][--null][pattern] [file ...]

見方を覚えるまでは呪文のようメッセージですが、慣れてくるとコマンドのWebサイト巡りをしなくてもサクっとその場で使い方を確認できるようになります。

・コマンドに直接ファイルを指定できる

grepやawk、sedなどのテキスト処理系のコマンドを実行する際に、catコマンドでファイルを開いてからパイプ|で渡して処理する事もできますが、多くのコマンドでは直接ファイルを指定して実行する事ができます。

catでfileを出力してからgrepでhelloの文字列を含む行を出力
$ cat file | grep hello
grepでfileの中からhelloの文字列を含む行を出力
$ grep hello file

また、ファイルを指定する際にワイルドカードが使用できるので、複数ディレクトリの中の特定の拡張子のファイルを指定したい場合は、ワイルドカードで階層と拡張子を指定してコマンドを実行する事ができます。

dirディレクトリが複数あり、その中にdmpファイルとlogファイルが混在している
$ tree ..├── dir1
│   ├── file.dmp
│   └── file.log
├── dir2
│   ├── file.dmp
│   └── file.log
└── dir3
    ├── file.dmp
    └── file.log

3 directories, 6 files
複数あるdirディレクトリの中からlogファイルだけを対象にgrepでhelloの文字列を含む行を出力
$ grep hello */*.log
dir1/file.log:hello
dir2/file.log:hello
dir3/file.log:hello

findコマンドを使ってファイルを検索してコマンドを実行しても同じ結果が得られますが、同じ階層のファイルを対象とする場合はワイルドカードを使用するとシンプルに記述することができます。

・同じオプションが複数回指定できる

コマンドによっては、条件やスクリプトなどのオプションによる指定が複数回できる場合があります。
同じコマンドをパイプ|で連結して繰り返し記述している場合や、複数の条件を指定する方法で困っている場合は、一度コマンドのオプションを調べてみると解決策が見つかるかもしれません。

$ cat file 
title
hello
world
text
grepでfileの中からhelloかworldの文字列を含む行を出力
$ grep-e hello -e world file
hello
world
sedでhelloをAに置換した後にworldをBに置換して出力
$ sed-e's/hello/A/'-e's/world/B/' file
title
A
B
text

・コンソールで変数やif、forが使える

プログラムの記述と直接関係無いように見えるコンソール操作ですが、コマンドの引数やオプションなどに変数を使用する事ができます。
変数に格納された値は、加工をして参照する変数展開ができ、非常に便利です。

helloの文字列をVALに格納し、eをaに置換してechoで出力
$ VAL=hello
$ echo$VAL
hello
$ echo${VAL/e/a}
hallo

また、変数だけでなく、コンソール上でifforなどの制御文も使う事ができます。
引数やオプションの一部の文字を変えながら繰り返し同じコマンドを実行する、などの場合は、コンソール上で変数や制御文を使ってコマンドを実行すると楽に処理することができます。

1から3までを変数iに格納しながらforループで繰り返してechoで変数iを出力
$ for i in{1..3};do echo$i;done
1
2
3
grepでfileの中からhello文字列を見つけられたらechoでHITを出力
$ if grep-q hello file ;then echo HIT;fi
HIT
$ if grep-q hallo file ;then echo HIT;fi$ 

また、制御文と同様に&&||などの論理演算子もコンソール上で使う事ができます。
簡単な条件分岐であればifをシンプルな記述に置き換えられたり、三項演算子の代わりとして使用することもできます。

grepでfileの中からhello文字列を見つけられたらechoでHITを出力
$ grep-q hello file &&echo HIT
HIT
$ grep-q hallo file &&echo HIT
$ 
grepでfileの中からh`a`llo文字列を見つけられなかったらechoでNONEを出力
$ grep-q hallo file ||echo NONE
NONE
$ grep-q hello file ||echo NONE
$ 

・コマンドの実行結果を確認できる

コマンドを実行すると実行結果(終了ステータス)が$?という特殊変数に格納され、この$?echoコマンドで出力する事で実行結果が確認できます。
また、実行結果はコマンドが成功すると0、失敗すると0以外が格納されます。

fileの中からhelloとh`a`llo文字列をgrepした結果 (helloは成功、h`a`lloは失敗)
$ grep hello file
hello
$ echo$?
0
$ grep hallo file
$ echo$?
1

ただ、$?は直前に実行したコマンドの実行結果が格納されるため、パイプ|で連結した複数のコマンドの実行結果を確認する事はできません。
その場合は${PIPESTATUS[@]}echoコマンドで出力する事で実行結果を確認できます。

catでfileを出力してからhello文字列をgrepした結果(catは成功、grepも成功)
$ cat file | grep hello file
hello
$ echo${PIPESTATUS[@]}
0 0
catでfileを出力してからhello文字列をgrepした結果(catは成功、grepは失敗)
$ cat file | grep hallo file
$ echo${PIPESTATUS[@]}
0 1

パイプ|でコマンドを連結する数が増えてきた場合は、実行後にecho ${PIPESTATUS[@]}で実行結果を確認することで、どこのコマンドが想定外の動きをしているか特定がしやすくなります。

おわりに

コンソールやコマンドは注意点も多いのでどこまで書くか悩みましたが、知っていれば調べられるので、まずは存在する事を知ってもらおう、と身近にあった事からピックアップしてみました。

数も少ないので中途半端な形になりましたが、少しでも幸せになれた人がいれば幸いです。


Viewing all articles
Browse latest Browse all 2820

Latest Images

Trending Articles



Latest Images