LinuC Level1 v10.0 対策コース(パート1)29/39
Linuxコマンド [echo/リダイレクト/パイプ編]
こちらの記事では、echo
やリダイレクト 、パイプ について解説します。コマンドの入出力を扱うコマンドですので、しっかり理解しましょう。
echoコマンド
echo
は文字列を標準出力するためのコマンドです。
基本的な使い方
echo 文字列
オプション
オプション | 説明 |
---|---|
-e | 「\n」で区切られたところで改行して表示する |
-n | 出力する全体の文字列の最後に改行をせずに表示する |
使用例
文字列をターミナル(画面)に出力する例を見てみます。
# "Envader!!"という文字列を出力します。
echo Envader!
Envader!
他にも、変数に格納されている値を出力することもできます。
# 'a'と'b'というシェル変数に値を代入し、その値を出力します。
a=20
b=50
# 'a'と'b'の値を出力します。変数名の先頭には'$'(ドルマーク)をつけます。
echo $a $b
20 50
# 環境変数USERのもつ値を出力します。
echo $USER
envader
# 改行して文字列を表示する例を見てみます。
echo -e "aaa\\nbbb\\nccc"
aaa
bbb
ccc
リダイレクト
リダイレクトは、コマンドの出力結果を標準出力先からファイルなどに変更する機能で、 >
(大なり)や >>
(2つの大なり)の記号で表現されます。
なぜリダイレクトするのか?
Linuxではファイルに文字列を書き込んだりテキストを編集するにはvimなどのエディタを使うのが一般的です。ただ、数文字や1~2行のテキストを書き込むのに都度vimでファイルを編集するのは面倒だと感じるでしょう。そんな時にリダイレクトを使用すると、コマンドラインからコマンドを実行するだけで済むので便利です。リダイレクトはecho
などのコマンドと組み合わせて使います。
基本的な使い方
リダイレクト(>
, >>
)の使い方を以下の表に示します。
記号 | 説明 |
---|---|
> | 指定したファイルに標準出力する |
>> | 指定したファイルに標準出力で追記する |
使用例
# 空ファイルfuga.txtに、"hogehoge"という文字列の標準出力をリダイレクトする。
echo hogehoge > fuga.txt
cat fuga.txt
hogehoge
# hoge.txtの中身を確認します。
cat hoge.txt
apple
# hoge.txtに文字列を追記します。
echo banana >> hoge.txt
cat hoge.txt
apple
banana
リダイレクトの種類として >
と >>
がありますが、これらは異なる動作をします。 >
を使用すると、指定したファイルの既存の内容は全て削除され、新たな出力結果で上書きされます。一方、 >>
を使用すると、指定したファイルの既存の内容に追記形式で出力結果が保存されます。そのため、既存の内容を保持しつつ新たな情報を追加したい場合は >>
を使用することが重要です。
ちなみに、リダイレクト先のファイルが存在しない場合、新規に作成されて保存されますので、わざわざ最初にファイルを準備する必要はありません。
パイプについて
リダイレクトの活用方法としてパイプ(|
) を使うことがあります。パイプはコマンドによる標準出力を別のコマンドに橋渡しをするものです。パイプを用いると、1行で複数のコマンドをまとめて実行できます。
基本的な使い方
パイプは、「Shift」+「¥」で入力できます。 以下のように、コマンドとコマンドをパイプで繋ぐように使います。
コマンド1 | コマンド2
使用例
例えば、 ps aux | grep nginx
は、 ps aux
コマンドで取得したプロセスリストから grep nginx
コマンドで nginx
に関連するプロセスのみをフィルタリングします。
# psの出力結果をgrepで条件に該当する内容のみに絞ります。
ps aux | grep nginx
root 1037 0.0 0.1 141124 1488 ? Ss 2021 0:00 nginx: master process /usr/sbin/nginx -g daemon on; master_process on;
www-data 1041 0.0 0.2 143944 2808 ? S 2021 0:11 nginx: worker process
prostudy 5347 0.0 0.1 15888 1076 pts/3 S+ 21:06 0:00 grep --color=auto nginx
また、コマンドは2つ以上つなげることもできます。
コマンド1 | コマンド2 | コマンド3 | コマンド4
このパイプを使った例は他にも沢山ありますので、ぜひ調べて使ってみてください。
出力を別のコマンドの引数として出力する
出力を別のコマンドの引数として扱いたい場合はxargs
コマンドを使用します。xargs
は基本的に|
(パイプ)と一緒に使用されます。一つの目のコマンドで出力した結果を|
(パイプ)で繋ぎxargs
で引数として扱い、別のコマンドを実行します。
簡単な使い方はcat
コマンドでファイルの中身を出力して|
(パイプ)で繋いでxargs
に引数で出力結果を渡します。その続きでtouch
コマンドを実行します。そしてさらにls
でディレクトリの中身を表示します。そうすると、data.txt
以外にapple
、grape
、lemon
ファイルが作成されていることが分かります。引数に渡された数だけコマンドを実行しています。
よくある使い方は、find
コマンドでファイルを出力し|
(パイプ)で繋いで引数としてxargs
に渡して、grep
コマンドでファイルごとに大量の文字列が含まれていないか探します。そして当てはまるファイルを表示します。
また引数に対してrm
コマンドを使用することでディレクトリ内のすべてのファイルを削除することもできます。
cat data.txt
apple
grape
lemon
# catの結果をxargsに引数として渡し、それぞれの名前の新しいファイルを作成
cat data.txt | xargs touch
ls
data.txt apple grape lemon
# 任意の文字列に当てはまるファイルを表示
find -type f | xargs grep "apple"
./data.txt:apple
# ディレクトリ内のファイルを一括削除
find -type f | xargs rm
# aから始まるファイルをすべて削除
find a* | xargs rm
# bで終わるファイルをすべて削除
find *b | xargs rm
# cが含まれるファイルをすべて削除
find *c* | xargs rm
# 3文字のファイルをすべて削除
find ??? | xargs rm
出力を標準出力とファイルの両方に送る
標準出力を行いファイルにも保存したい場合は tee
コマンドを使用します。標準エラー出力も標準出力と一緒に出力したい場合は2>&1
を使用します。
tee
コマンドはUnixやLinuxで使われるコマンドの一つで、パイプラインの途中で出力をファイルに書き込むと同時に標準出力にも出力します。この機能は文字通りT字のパイプのような動きをするためtee(T)という名前がついています。出力をファイルに保存しつつ、同時に画面にも表示したい場合などに便利です。
また、 2>&1
はシェルのリダイレクトを利用した構文で、標準エラー出力を標準出力に統合するという意味です。ここで2は標準エラー出力(STDERR)、1は標準出力(STDOUT)を表しています。したがって、 2>&1
は「標準エラー出力を標準出力と同じ場所に出力する」という意味になります。
これらの機能を組み合わせると、「コマンドの実行結果とその途中のエラーをすべてファイルに出力し、同時に画面に表示する」ということが可能になります。そのため、コマンドの実行結果を後から確認したり、エラーを解析したりする際に有用です。
以下のコマンドは上記の説明を元にした例です。
# ファイル一覧を表示し、その結果をdata.txtに保存しつつ、画面にも表示する
ls | tee data.txt
# findコマンドを実行し、その結果と途中のエラーメッセージをすべてdata.txtに保存しつつ、画面にも表示する
find / -name "somefile" 2>&1 | tee data.txt
まとめ
今回はecho
コマンドとリダイレクト、パイプについて学習しました。リダイレクトは様々な状況で活用でき、作業の効率を上げる便利な機能です。色々と試してみながらしっかりと使いこなせるようにしましょう。
問題を解くためには、十分な画面サイズのPC環境をご利用下さい。