蚊帳の中の日記

ゆるく生きてます

lpic 101 - level 1に合格したけど、実務で使えそうな知識をまとめてみる【テキスト処理系コマンド編】

前回の続き。

lpic試験では基本的なunixコマンドについても学べるのだけど、今回は普段あまり使ってなかったけど使ってみると非常に便利そうなテキスト処理系のコマンドjoin,cut,grep,sed….etc)を集めてみた。*1

テキスト処理系コマンドって便利

ちょっと前に達人プログラマーという本を読んだのだけど、第3章基本的なツールの19節に「テキスト操作」というのがあって、

正しく使えばこういったツール(テキスト操作言語やシェルなど)は驚くほど手際よく巧妙な成果物を生み出せます。しかし、マスターするのにはそれなりの時間がかかるのです。

と書かれている。まあ、覚えておかなくてもいいけど、ちょっと痒いところに手を伸ばしたい時に、今回のコマンドは非常に役に立つなと感じている。

grep, egrep, fgrep

grepは有名だけど、egrepfgrepというのもある。(この2つはどちらもgrepで出来ることなので、なぜあるのかよくわからないけど、トリビア要素としては面白かった)

  • egrep:拡張正規表現と呼ばれる普通の正規表現とは少し異なったパターンの正規表現を使う場合に使う。grep -Eと同じ。
  • fgrep:正規表現使わないgrep*?などを正規表現の特定文字ではなく普通の検索文字列として識別したい場合に利用する。例えば、fgrep ‘*’ hoge.txtgrep ‘\*’ hoge.txtは同じ。
最近良く使った手法
# -vで指定の文字列を除外 
grep -v ‘hoge’ sample.txt

# 複数文字列をOR検索(-eをつなげても出来るけど見づらくなる)
grep ‘hoge|fuga|hugo’ sample.txt

# 一致した行の前後の行も出力
grep ‘hoge’ sample.txt -A 10 -B 10

# 上の-vと組み合わせて、余計なログは省いてtail -fする
tail -f xxx.log | grep -iv 'hoge' | grep -Ev [poke|fuga]

…etc *2

正直自分のローカルマシン上だと、ptコマンド(Platinum Searcher)などを使って検索することが殆どだし、標準出力をパイプで渡して検索したいときなども、grepよりもpecoを使ってしまう(最近だとfzfがいいのかな)ことが多いから、ほぼgrepを使う機会はないのだけど、sshした先のlinuxサーバーにはそれらのツールはインストールしていない事が多いので、grepの使い方を覚えておくと便利だったりする。

sort

行単位でテキストファイルをソートしてくれる。デフォルトでは昇順になっている。csvとかリストファイルとかログファイルで、ちょっとしたソートをして表示したい時にたまに使える。

個人的には-bオプションで行頭の空白を無視してくれるのが便利で、行頭に空白があるテキストファイルでも特に気にせずにソートしてくれる。
あと-nをつけないと数値をテキストとして処理してソートしてしまうので、数値でソートしたいときは覚えておくと便利。

sort -b hoge.csv | pbcopy

uniq

入力されたテキストの中で重複している行を調べてくれる。
デフォルトなら重複を排除して表示してくれるのだけど、-dをつけると重複している行のみを出力する。-uなら重複していない行のみを出力する。

-uの方を使う機会が多くて、最近だと、とあるcsvファイルに重複した情報がないかどうかを確認する時に

uniq -d hoge.csv

ってやって、特に出力がなければ重複なしと判断したりした。便利。*3

wc

テキストの行数、単語数、バイト数を表示してくれる。 最近でかいcsvを扱う時に行数を確かめるために使いまくった。

xargs

標準入力で受け取ったテキストを引数にして、与えられたコマンドを実行する

# findでhogeという名前のファイルを見つけて、それらをrmする。
find . -type f -name ‘hoge’ | xargs rm

これだけではあまりは利点はなさそうに見えるけど、findするファイルが非常に多かったとき、rm *とかだとシェルの制限で削除するファイルが多すぎてエラーになってしまうことがある。でも、xargs経由で渡すとxargsがうまい具合にシェルの制限を超えないように処理してくれる。*4

split

指定した行数でファイルを分割してくれる。

これもでかいcsvを扱ったときの話なのだけど、そのcsvを分割したいとなって、その時はviエディタでシュッと分割したい行に移動して別ファイルに残りをコピペして分割するということをしたのだけど、splitを使えば一瞬だったな〜と反省した。ちょっとしたテキスト分割には重宝するはず。

tee

標準出力とファイル書き出しを両方を行ってくれる。文字通りT字に処理結果を分岐してくれることから、teeという名前らしい。

正直、勉強したときは「いつ使うんだ?」と思ったけど、以下の記事を見て「なんか覚えておいたら、かっこよそう!と思ってしまった。

www.atmarkit.co.jp

(番外)便利そうだけど使い道に困ってしまった子達

  • tr
  • join
  • nl
  • od
  • expand
  • unexpand
  • fmt
  • pr

jointrは工夫すれば使えそうな気はしているのだけど、まだ真価がわかっていない。どういったコマンドなのか、他も調べてもらえればわかるけど、正直「いつ使うの?」と感じてしまった。

こういったコマンド達って、ちょっとした時に便利だから本当に重宝する。

テキスト処理と言ったら、sedとかawkを考える人が多いかも知れないが、正直自分はまだ使いこなせてないので、もう少し勉強してからまたの機会にでもネタにしようかなと思う。

*1:あくまでlpic 101 level1の試験範囲のコマンドに今回は限定している。

*2:全然簡単な使い方かも知れないけど、これくらいのことを新しく覚えておくだけでも出来ることが増えた実感がある

*3:ぐぐるとsortコマンドとの組み合わせが多く見られる感じがあるけど、他にも色々使い道はありそう

*4:ちょっと用法は違うけど、xargsで並列処理を実験してるqiita記事があって、面白かった。ref:

xargs のオプションいろいろ - Qiita