竹の子エンジニア

30代から目指すエンジニアの日記

【備忘録】Linuxのコマンドで遊ぶ

どうもこんばんわ。
わりとご無沙汰しております。

最近は仕事でひさしぶりにサーバーを触る機会をいただいているんですが、
やっぱりCUIって楽でいいなと思っています。

単純なテキストファイルを整形するときに役立つawkであったり、grepであったりが
なんなく使えるところが嬉しいところですね。

例えば、以下のような感じのログファイルがあった場合は
awkを使って簡単に出力ができたりします。
なお、以下のコマンドについてはCentOS7で動作確認しています。

テキストファイル例(fruit.log)
apple banana mikan
kaki momo budou
mango biwa ichigo

上のテキストファイルのappleだけ一丁前に英語で他がローマ字なのが
私の英語力のなさを物語っていますね!

くだらない話はさておき、上記のテキストファイルの一行目と三行目を抜き出したかった場合

$ awk '{ print $1,$3}' fruit.log

と入力するだけで、一行目と三行目を抜き出せます。

もしファイルが空白区切りじゃない場合も、以下のオプションを有効にすることで可能です。
上のファイルがカンマで区切られたとすると以下のようになります。

$ awk -F, '{ print $1,$3}' fruit.log

たったオプションに-Fを指定して区切り文字を指定するだけで可能です。

あと、grepについてですが、こちらもテキストファイルの検索でなじみ深い方も
いるかと思いますが、Linuxで出力された内容を整形するときに使えます。

例えば、Linuxのコマンドでifconfigを叩いて以下みたいな出力があったとします。

lo0: flags=8049 mtu 16384
options=3
inet6 ::1 prefixlen 128
inet 127.0.0.1 netmask 0xff000000
inet6 fe80::1%lo0 prefixlen 64 scopeid 0x1
nd6 options=1
gif0: flags=8010 mtu 1280
stf0: flags=0<> mtu 1280
en0: flags=8863 mtu 1500
options=10b
ether 38:c9:86:1c:c7:31
inet6 fe80::3ac9:86ff:fe1c:c731%en0 prefixlen 64 scopeid 0x4
inet 192.168.100.103 netmask 0xffffff00 broadcast 192.168.100.255
nd6 options=1

上の出力からlo0: とつく行だけ抜き出したい場合
ifconfigにパイプ(||)をつけてgrepを叩きます

$ ifconfig || grep lo0:

こうすることで、lo0: に該当する行だけが出力できます。

加えて、lo0:を抜き出したいけど、その後の数行を抜き出したい時なんかは

$ ifconfig || grep -A 2 lo:

オプションに-Aを入力し、一致した後の取り出したい行数を指定します。
すると、上のオプションでは2行分取得することができます。

最後にパイプを駆使することで、grepawkのあわせ技もできます。

例えば、grepでlo:と一致した行の、末尾の数値を取り出したい場合
今回は「lo0: flags=8049 mtu 16384」の最後になるので
16384を取得したいとします。

これもパイプを駆使することで可能となります。

$ ifconfig || grep lo: || awk '{ print $4 }'

たったこれだけです。
※ちなみに行末の値を取得したい場合は、awk '{ print $NF }'で指定もできます。

そんなこんなで久々にLinuxを触っていますが、やはりテキストファイルを整形したいときは
Linuxが一番ですね!
プログラムを書くことなく、さらっとこんなことができます。
(ちなみにWindowsでもCygwin等いれるとLinuxコマンドの恩恵を受けれるかと思います)

以上、そんな感じの最近です。
KVMについても忘れてませんが、中々時間が取ません。。

余談。

中々時間が取れない原因。

モンスターハンタークロス

モンスターハンタークロス

片手剣が強くなりすぎて、ハンマー使いの私としては悲しいかぎりです。。
片手剣でもすっごいスタン取れる。。。