Linuxコマンドを勉強~wc、cut、tr~

リダイレクト関連でひとつ取りこぼしが・・・

Linuxには/dev/nullという特殊なデバイスファイルがありまして、
このファイルに書き込んだ内容はすべて削除されます。
逆に/dev/nullを読み込むと、必ずEOF(End Of File)を返します。

/dev/nullは、例えば標準出力や標準エラーを出力させたくない場合にリダイレクト先として使用します。

EOFはファイルの終端を表す文字でして、前回のteeコマンドの例でいうと、teeコマンドは実行されると標準入力(キーボード入力)をずっと待っている状態になります。
キーボードからEnter(改行文字)が入力されるとそこまで入力した行をファイルと画面に出力して、次の入力を待ちます。その繰り返しなので、特別なことをしないと延々と入力を待ち続けます。
で、どうすれば入力を終わらせるかというと、Ctrl+Dを押します。Ctrl+DはEOFを表します。
標準入力はEOFまでを入力とするので、そこでteeコマンドは終了します。

※ちなみに、Ctrl+Cは処理の中断を行います。EOFとは違うので注意が必要です。

wc

wcコマンドはファイルの行数やバイト数を数えます。
wcコマンドのオプションは以下の通りです。

-c バイト数をカウント
-l 行数をカウント
-m 文字数をカウント
-w 単語数をカウント

とにかくやってみます。
c.txtファイルは以下の内容となっています。

aa bb c1=d2\n
ef g3.h45\n
[EOF]

分かりやすさのためにodで見てみます。

※-tx1というのは、1バイトずつ16進数で表示するときのオプションです。

コマンド 表示される数 備考
wc -c c.txt 22 odの結果より、22バイトと一致します。
wc -l c.txt 2 改行が2つあるので2行です
wc -m c.txt 22 odの結果より、改行含めて22文字と一致します。
wc -w c.txt 5 単語というのは、スペースで区切られた文字列です。5で一致します。

cut

cutコマンドは、ファイルの各行から特定のフィールドを切り出します。
フィールドというのは、ファイルの1行をある文字で区切った1つ1つの文字列のことです。

例えばwcコマンドの-wオプションはスペース区切りを単語としてファイルの単語数をカウントしていました。
その1単語がフィールドです。

先ほどのc.txtファイルから、最初の単語だけを切り出してみます。

-dオプションは、フィールドを区切るための文字を指定します。
-fオプションは、何番目のフィールドを切り出すかを指定しています。

cutコマンドのデフォルトの区切り文字はTAB(\t)です。
ですので、先ほどのコマンドは-dオプションを指定しないとc.txtの全文を切り出してしまいます。
文字で行を区切る場合(-dオプション使用時)は、-fオプションは必須です。

cutコマンドは、何文字目から何文字目、あるいは何バイト目から何バイト目、という区切り方もできます。
例として、c.txtファイルの2文字目から5文字目を切り出します。

5バイト目から後ろの文字をすべて切り出します。

何文字で区切る場合は-c、何バイトで区切る場合は-bとします。

この何番目から何番目までという書き方は、-fオプションでも使用できます。
c.txtの2番目から3番目までのフィールドを切り出します。

逆に-cや-bオプションで-c4などとすると、4文字目だけを切り出します。
切り出す範囲の指定方法はどのオプションでも同じです。

また、連続していない範囲のフィールドも切り出すことができます。

上記は、c.txtファイルの1番目と3番目のフィールドを切り出しています。

これらを組み合わせて好きなフィールドを切り出すことができます。

tr

trコマンドは、標準入力から入力された文字列を、指定したフォーマットで変換して画面に表示します。

書式はこうなっています。

セットというのは、ある文字の集合や特定の文字列(文字クラス)のことです。

・・・結局trコマンドは何ができるのかというと、例えばファイルの小文字を大文字にするとか、ファイルの余分な空白を削除するとか、そういったことを行います。
大抵の場合、標準入力をファイルにリダイレクトしてファイルの変換に使うのでファイルを例にしています。

やってみましょう。

このように、ファイル内の小文字をすべて大文字に変えます。

指定した文字をファイルから削除する場合は-dオプションを使用します。
不要な’Taro’という文字をファイルから削除します。

・・・’Taro’だけではなく、’This’の’T’や’cat’の’a’も消えてしまいました。

trコマンドはファイルの1文字単位で文字の集合に含まれるものすべてを操作(変換や削除)の対象とするので注意が必要です。
文字列を変換する場合は、sedコマンドなどを使用します。

もうひとつ、-sオプションを使うと、指定した文字の繰り返しを、1つにまとめてくれます。
例えば、単語の間に無駄に空白の多いファイルがあったとして、-sオプションを使って単語間の無駄な空白を1つの空白にまとめることができます。

最後に、trコマンドは文字の集合だけでなく、文字クラスという特定の文字列でフォーマットを指定できます。
例えば、最初の小文字を大文字に変換するコマンドですが、こう書くことができます。

[:lower:]や[:upper:]は文字クラスと言って、決まった文字の集合を示す用意された文字列です。文字クラスの代表的なものは以下の通りです。

[:alnum:] 数字と英文字
[:alpha:] 英文字
[:digit:] 数字
[:lower:] 小文字
[:upper:] 大文字
[:blank:] 水平方向の空白
[:space:] 水平方向と垂直方向の空白

※本当にどうでもいい話
ちなみに、teeコマンドが何でティーかというと、

と分岐する流れがT(ティー)に見えるからだとかなんとか・・・

言われてみれば納得!

なんですが、何の略かずっと考えてたのに見た目って・・・

あとtacコマンドはcatの逆ですね。これは分かりやすい。

あとcdコマンドってmanコマンドでマニュアル表示できないんですよね。
bashのビルトインコマンドというものらしく、普通のコマンドのパス(/binなど)には置いていない。
cdコマンドのマニュアルを見たい場合は、「help cd」で見れます。

広告
  • LINEで送る