Linuxコマンド練習したいけど・・・
どのコマンドから練習すればいいの?
前回に引き続き、この記事ではLinux初心者がコマンドを練習する前にまず覚えておくべきコマンドを解説します。
今回のコマンドは実用的なものばかりですのでしっかり覚えましょう!
前回の内容はこちらで解説していますのでチェックしてみて下さい。
最初に覚えておくべきLinuxコマンド一覧 その2
今回解説するコマンドはこちらです!
ちょっと多いですが、どれもLinuxを扱う上で必須のコマンド達ですので頑張っていきましょう!
- echo
- >, >> (リダイレクト記号)
- mv
- | (パイプ)
- seq
- sort
- sed
- awk
- xargs
- bash
それでは順に解説していきます。
echo
echoコマンドはechoの右側に指定した文字列をそのまま表示するコマンドです。
このコマンドは環境変数(「$変数名」という形式で参照することができる変数)に設定された値を表示するのに使用できます。
また、次に解説するリダイレクトと組み合わせて使用されることも多いです。
$ echo 'hogefuga'
hogefuga
# 環境変数$HOMEをechoで参照して現在のユーザのホームディレクトリのパスを表示する
$ echo $HOME
/home/root
>, >> (リダイレクト記号)
「>」や「>>」はリダイレクト記号と呼ばれるもので、コマンドの計算結果をファイルに保存するときに使用します。
先ほど紹介したechoコマンドで指定した文字列をファイルに保存してみましょう。
$ echo 'hogefuga' > a.txt
$ ls
a.txt
# cat コマンドで中身を表示
$ cat a.txt
hogefuga
echoコマンドで指定した「hogefuga」の文字列がa.txtファイルに保存されていますね。
「>>」も「>」と同様にコマンドの計算結果をファイルに保存することができますが、「>」は同名のファイルが指定された場合は上書きするのに対して、「>>」は同名ファイルがすでに存在した場合はそのファイルの末尾に指定の文字列を追記します。
実際に動きを見てみましょう。
# 先ほどのa.txtに対して異なる文字列で内容を上書きする
$ echo 'fugafuga' > a.txt
$ cat a.txt
fugafuga
# 続けてa.txt に新たな文字列を追記する
$ echo 'hogehoge' >> a.txt
$ cat a.txt
fugafuga
hogehoge
ファイルの末尾に文字列が追記されていますね!
mv
mvはファイルやディレクトリを移動するコマンドです。
このコマンドは移動の他にファイルやディレクトリの名前を変更するときにもよく使用されます。
$ pwd
/home/vagrant
### ディレクトリとファイルの移動
$ ls
dir_a dir_c file_a.txt
# dir_aをdir_cへ移動
$ mv dir_a dir_c/
$ ls
dir_c file_a.txt # dir_aは移動したので表示されない
$ cd dir_c
$ ls
dir_a #dir_cディレクトリの中に移動された
# 元のディレクトリに戻る
$ cd /home/vagrant
$ ls
dir_c file_a.txt
#file_a.txtをdir_cへ移動
$ mv file_a.txt dir_c/
$ ls
dir_c
$ cd dir_c
$ ls
dir_a file_a.txt # file_a.txtもdir_cディレクトリへ移動された
### ディレクトリとファイルの名前変更
$ ls
dir_a file_a.txt
# ディレクトリ名をdir_aからdir_aaaに変更
$ mv dir_a dir_aaa
$ ls
dir_aaa file_a.txt
# ファイル名をfile_a.txtからfile_aaa.txtに変更
$ mv file_a.txt file_aaa.txt
$ ls
dir_aaa file_aaa.txt
| (パイプ)
「|」パイプは、コマンドを使って出力された内容を次のコマンドへ橋渡しするために使用されるコマンドです。
パイプを使って複数のコマンドを組み合わせることにより、少ないコマンドの記述で複数のコマンドが処理した結果を受け取ることができます。
ここでは先に解説したコマンド、echoとgrepをパイプを使って組み合わせて使ってみましょう。
# echo, grepをパイプで組み合わせる
$ echo 'fugahogehogefuga' | grep 'hogefuga'
fugahogehogefuga # hogefugaの部分が強調表示される
このようにパイプを使うことでechoコマンドの出力結果「fugahogehogefuga」を次のコマンドであるgrepの入力(検索対象文字列)に渡します。
grepはパイプで渡された「fugahogehogefuga」を検索対象としてこの文字列の中から「hogefuga」を検索して、検索の結果を表示します。
またパイプは、複数指定することができるので、コマンド | コマンド | コマンド | コマンド・・・のように繋げていくことが可能です。
seq
seqは連続した数字を表示するコマンドです。
「seq 終了の数」のように実行します。
連番を生成したいときに便利です。
# 5までの連続した数字を表示
$ seq 5
1
2
3
4
5
# 100までの連続した数字をゼロ埋めで表示
$ seq -w 100
001
002
003
・・・省略
099
100
sort
sortは名前の通り、並び替えを行うコマンドです。
例えば下記のデータが記録された「sample.txt」の中身を並べ替えてみます。
$ cat sample.txt
45, 3, hoge
10, 1, fuga
1, 5, hogehoge
9, 10, fugafuga
# 並べ替える
$ sort sample.txt
1, 5, hogehoge
10, 1, fuga
45, 3, hoge
9, 10, fugafuga
sortコマンド実行時にオプションを指定しなかったので、先頭の列の値が小さい順に並び替えを行っています。
ただし、先頭の数字を数値ではなく文字列として比較しているために1の次に10が表示されています。(左から文字列が比較されるので一番左の値が小さい順に並んでいます)
次にオプションを付けて文字列ではなく、数値として並べ替えてみます。
# 先頭の列を文字列ではなく数値として並べ替える
$ sort -n sample.txt
1, 5, hogehoge
9, 10, fugafuga
10, 1, fuga
45, 3, hoge
今度は数字の小さい順に並び替えることができました。
今までの例では先頭列に対して並び替えを行ってきましたが、sortコマンドでは「-k」オプションを指定することで並び替え対象となる列を指定することができます。
# 2列目を並び替え対象の列に指定する
$ sort -k2 -n sample.txt
10, 1, fuga
45, 3, hoge
1, 5, hogehoge
9, 10, fugafuga
さらに「-k」オプションでは列の範囲を指定することができるため、「n列目からm列目を基準に並べ替えを行う」といったことが可能です。
# 分り易くするため、sample.txtの最後の行に「45, 2, hoge」のデータを追加
$ echo '45, 2, hoge' >> sample.txt
$ cat sample.txt
45, 3, hoge
10, 1, fuga
1, 5, hogehoge
9, 10, fugafuga
45, 2, hoge
# 1列目から2列目を基準に数字順で並べ替えを行う
$ sort -k1,2n sample.txt
1, 5, hogehoge
9, 10, fugafuga
10, 1, fuga
45, 2, hoge
45, 3, hoge
1から2列目を基準に並べ替えをすることができました!
sed
sedは入力した文字列を別の文字列に置換するコマンドです。「sed ‘s/文字列1/文字列2/’」のように使用します。
入力で受け取った文字列に含まれる「文字列1」を「文字列2」に置換します。
このコマンドは非常によく使います。
# legendをkingに置換する
$ echo 'I am legend' | sed 's/legend/king/'
I am king
sedの引数「’s/legend/king/’」の意味は「s」が文字の置換を行うことを表していて、最初の「//」に挟まれた部分が置換対象の文字列、その後の「//」に挟まれた部分が置換後の文字列です。
次に文字列「piyo piyo」を「poyo poyo」に置換してみます。
# piyo piyo を poyo poyoに置換
$ echo 'piyo piyo' | sed 's/i/o/'
poyo piyo
期待した置換後の文字列は「poyo poyo」でしたが結果は「poyo piyo」となってしまいました。
これは ‘s/i/o/’ と指定した場合は、最初に見つかった対象文字だけ置換して処理が終わるためです。
対象となる文字すべてを置換したい場合は最後の「/」の後に「g」を付けて「‘s/i/o/g’」としてあげます。
オプションの「r」はディレクトリの中にあるファイルやディレクトリを再帰的に処理するという意味がありま
# piyo piyo を poyo poyoに置換
$ echo 'piyo piyo' | sed 's/i/o/g'
poyo poyo
今度は期待した通り「poyo poyo」になりました!
awk
awkはプログラミング言語の1つです。
プログラミング言語というと難しそうな感じがしますが、コマンドのように扱うことができます。
特に、grepやsedといったコマンドと組み合わせることでちょっとしたデータ処理をワンライナー(その場かぎりの1行プログラム)で記述することができます。
例えば、入力で受け取った数字のうち偶数であるものだけを出力したい場合はこのようになります。
$ seq 10 | awk '$1%2==0'
2
4
6
8
10
「$1」は入力として読み込んだ行の1行目の文字列または数字を表す変数になります。
入力データが2列目以上ある場合はそれぞれ、$2, $3・・・と表せます。
awkでは他にもこのような処理が簡単に記述できます。
# 1列目の数字が偶数または奇数の場合、数字の隣にそれぞれ「Even」、「Odd」と表示する
$ seq 10 | awk '$1%2==0{print $1, "Even"} $1%2==1{print $1, "Odd"}'
1 Odd
2 Even
3 Odd
4 Even
5 Odd
6 Even
7 Odd
8 Even
9 Odd
10 Even
少しプログラムっぽく感じるかもしれませんが、ワンライナーでここまで出来てしまいます。
AWKでは条件をパターン(上記の例だと「$1%2==0」と「$1%2==1」の部分)、処理をアクション(上記の例だと「{print $1, “Even”}」と「{print $1, “Odd”}」の部分)と呼びます。
このパターンとアクションの組をルールと呼び、ルールは2つ以上並べることができます。
つまり以下のようなイメージになります。
awk ルール(パターン アクション) ルール(パターン アクション) ルール(パターン アクション)・・・
AWKはプログラミング言語ということもあり、その機能は豊富でAWKの書籍もあるほどです。
もっと詳しくしりたい方は以下の書籍を参考にしてみて下さい
今回は最後にBEGINパターン、ENDパターンをご紹介して終わりにしたいと思います!
BEGINパターンは、awkが1行目の処理を始める前にやってほしいことを記述します。
ENDパターンは、awkが最後の行の処理を終えた後にやってほしいことを記述します。
例を見てみましょう。
先ほどの例の先頭行と最終行に区切り線「——」を表示してみます。
# 最初と最後の行に区切り線を表示する
$ seq 10 | awk 'BEGIN{print "--------------"}$1%2==0{print $1, "Even"} $1%2==1{print $1, "Odd"}END{print "--------------"}'
--------------
1 Odd
2 Even
3 Odd
4 Even
5 Odd
6 Even
7 Odd
8 Even
9 Odd
10 Even
--------------
ちょっとだけ見た目がかっこ良くなりましたね!
xargs
xargsは標準入力から受け取った値を任意のコマンドに引数として渡すコマンドになります。
# 1〜5の空のファイルを作成する
$ seq 5 | xargs touch
$ ls
1 2 3 4 5
seqコマンドで生成された1から5の値をtouchコマンドの引数として渡してコマンドが実行されました。
もう少し実用的なコマンドにしてみましょう。
# n.txtという名前の空ファイルを作成する
$ seq 5 | xargs -I@ touch @.txt
$ ls
1.txt 2.txt 3.txt 4.txt 5.txt
xargsコマンドの「-I(大文字のアイ)」オプションの後ろに「@」を指定するとxargsが受け取った文字列を1つずつ入れて変数のように使用することができます。オプションで指定する文字は@以外の文字でも大丈夫です。
xargsはいろいろな場面で使えるので覚えておくと非常に便利です!
bash
bashはコマンドを並べた命令(文字列)をパイプから受け取ることができます。
例えばechoコマンドなどで生成した命令(コマンド)の文字列をbashに渡すことで命令を実行することができます。
# echoで生成した命令の文字列をbashに渡して実行する
$ echo 'touch sample.txt' | bash
$ ls
sample.txt
先ほどのawkコマンドと組み合わせてみましょう。
seqの数字が偶数の場合はファイルを作成し、奇数の場合はディレクトリを作成します。
# 偶数の場合ファイル、奇数の場合ディレクトリを作成する
$ seq 5 | awk '$1%2==0{print "mkdir "$1"_Even"} $1%2==1{print "touch "$1"_Odd.txt"}' | bash
$ ls
1_Odd.txt 2_Even 3_Odd.txt 4_Even 5_Odd.txt
例えばテストデータなどでファイルが大量に必要になる場合、今回の例のようにseqやawkを組み合わせることで
100個・1000個のファイル作成をワンライナーで実行することも簡単にできてしまいます。
このコマンドも覚えておくと強力な武器になるのではないでしょうか。
まとめ
今回もLinuxコマンド練習前に覚えておくべきコマンド一覧と題して、Linuxを使う上でより実践的に使える、覚えておきたいコマンドをご紹介しました。
今回登場したコマンドを覚えていれば、今まで以上に効率的なLinuxコマンド練習ができるのではないでしょうか。
また、無料でLinuxコマンドが学べる学習サイトもこちらで紹介していますので参考にしてみて下さい。
最後まで読んでくださってありがとうございました。
ここでご紹介した情報が少しでもみなさまのお役に立てれば嬉しいです。