Linuxのコマンドラインで指定した部分の切り出しを行う
cut
cutは入力の各行から選択した部分を切り出して、標準出力に出力するコマンド。
例えば
abc,123,xyz
defg,4,w
hi,56789,stuv
のような簡単なCSVファイルinput.csvがあるとき、ここから2列目を抜き出したい場合
cut -d ',' -f 2 input.csv
と実行すると、2列目を切り出すことができる。
-d で区切り文字となるデリミタを指定。
-f で抜き出したい列数を指定。複数列切り出したい場合は「,」カンマで区切って複数の列を指定できる。
また、なかなか使用する機会はないと思うが-bオプション(–bytesオプション)というオプションが有る。
これは、必要な項目をバイト数で指定して切り出しを行う。
-b2-5の様に指定すると、2バイト目から5バイト目までが切り出される。
単純に-b3の様にしていすると、3バイト目のみが切り出されることとなる。
例で上げたCSVの用に、ちゃんとデリミタで指定した文字で区切られている物が対象であればcutコマンドだけをそのまま使えるが、lsの結果からファイル名とサイズを抜き出そうとするとうまくいかない。
ls -alh の結果は見た目上よく見えるように整形されているため、サイズ部分やユーザ名などの長さによってデリミタとなるスペースの数が違うのが原因だ。
cutを使用せずに他のコマンドを使用して目的を達成できるが、どうしてもcutを使用して抜き出したい場合はsedコマンドを併用することで可能となる。
ls -alh | sed -e 's/\s\{1,\}/ /g' | cut -d ' ' -f5,9
sedコマンドで連続するスペースを一文字のスペースに変換し、その結果をcutに渡すことで、区切り文字をスペースとして扱えるようになる。
sedに渡している正規表現だが、\sでスペース文字を指定しそこに続けて{1,}を置くことで1文字以上の連続したスペースを表している。
そうすることで、cutコマンドでデリミタ文字にスペースを指定することで目的の列を抜き出すことができる。
もし、使用している環境でawkコマンドが使える場合は、awkコマンドを使用することでもっと簡単に抜き出しを行うことができる。
また、少し変更するだけで、出力する順番等も手軽に変更することが可能となる。
ls -alh | awk '{print $9 $5}'