lpic 101 - level 1に合格したけど、実務で使えそうな知識をまとめてみる【テキスト処理系コマンド編】
前回の続き。
lpic試験では基本的なunixコマンドについても学べるのだけど、今回は普段あまり使ってなかったけど使ってみると非常に便利そうなテキスト処理系のコマンド(join
,cut
,grep
,sed
….etc)を集めてみた。*1
テキスト処理系コマンドって便利
ちょっと前に達人プログラマーという本を読んだのだけど、第3章基本的なツールの19節に「テキスト操作」というのがあって、
正しく使えばこういったツール(テキスト操作言語やシェルなど)は驚くほど手際よく巧妙な成果物を生み出せます。しかし、マスターするのにはそれなりの時間がかかるのです。
と書かれている。まあ、覚えておかなくてもいいけど、ちょっと痒いところに手を伸ばしたい時に、今回のコマンドは非常に役に立つなと感じている。
grep, egrep, fgrep
grep
は有名だけど、egrep
とfgrep
というのもある。(この2つはどちらもgrep
で出来ることなので、なぜあるのかよくわからないけど、トリビア要素としては面白かった)
- egrep:拡張正規表現と呼ばれる普通の正規表現とは少し異なったパターンの正規表現を使う場合に使う。
grep -E
と同じ。 - fgrep:正規表現を使わないgrep。
*
や?
などを正規表現の特定文字ではなく普通の検索文字列として識別したい場合に利用する。例えば、fgrep ‘*’ hoge.txt
とgrep ‘\*’ 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
という名前らしい。
正直、勉強したときは「いつ使うんだ?」と思ったけど、以下の記事を見て「なんか覚えておいたら、かっこよそう!と思ってしまった。
(番外)便利そうだけど使い道に困ってしまった子達
- tr
- join
- nl
- od
- expand
- unexpand
- fmt
- pr
join
とtr
は工夫すれば使えそうな気はしているのだけど、まだ真価がわかっていない。どういったコマンドなのか、他も調べてもらえればわかるけど、正直「いつ使うの?」と感じてしまった。
こういったコマンド達って、ちょっとした時に便利だから本当に重宝する。
テキスト処理と言ったら、sed
とかawk
を考える人が多いかも知れないが、正直自分はまだ使いこなせてないので、もう少し勉強してからまたの機会にでもネタにしようかなと思う。