仮想サーファーの波乗り

仮想サーファーの日常

プログラミング・SNS分析・自動化などに関してよく書く雑記ブログ

ファイルを操作する系の忘れたら見る用シェルコマンドまとめ


会社のシェルスクリプトの神に触発されてシェルスクリプトの基本を学びなおした今週末でした。

ファイルを操作する系のシェルコマンド忘れたら見る用のまとめをしておきます。


ファイル操作系のコマンドまとめ


cp:ファイルのコピー作成

$ cp <コピー元ファイル名> <コピー先ディレクトリ名>

コピー元ファイルをコピー先ディレクトリに上書きコピー保存する。

ex)

$ ls
original_file.txt

$ cp original_file.txt copied_file.txt

$ ls
copied_file.txt     original_file.txt


sort:ファイル内容の並び替え

$ sort -n <ファイル名>

ファイルの中身を数値として昇順に並び替え。

ex)

$ cat number_file.txt 
3
42
5
23
3
21

$ cat number_file.txt | sort
21
23
3
3
42
5

$ cat number_file.txt | sort -n
3
3
5
21
23
42

普通にsortするだけだとASCII文字の昇順で並び替えられ、「-n」オプションをつけると数字の昇順に並び替えられる。

「|」はパイプ。標準出力から受け取った値を次の標準入力として受け渡すことができる。


$ sort -r <ファイル名>

ファイルの中身を降順に並び替え。

ex)

$ cat number_file.txt | sort -n
3
3
5
21
23
42

$ cat number_file.txt | sort -nr
42
23
21
5
3
3

「-r」(reverse)オプションをつけると降順に並び替えられる。


wc:ファイルの内容のカウント

$ wc <ファイル名>

ファイルの中身の行数・単語数・バイト数・ファイル名を表示する。

ex)

$ wc number_file.txt 
       6       6      15 number_file.txt

$ wc -l number_file.txt 
       6 number_file.txt

「-l」オプションをつけると行数とファイル名だけが表示される。


uniq:ファイルの中身の重複をなくす

$ uniq <ファイル名>

ファイルの中身の重複を一つにまとめて表示する。

ex)

$ cat duplicated.txt 
90
90
1234
1234
8731

$ cat duplicated.txt | uniq
90
1234
8731

$ cat duplicated.txt | uniq -c
   2 90
   2 1234
   1 8731
   1 128

「-c」オプションをつけると、何個重複しているか表示してくれる。


cut:入力の一部を切り出す

$ cut -d <区切り文字> -f <フィールド番号>, <フィールド番号>, ... <ファイル名>

指定したファイルの中身の1行を区切り文字で区切り、指定したフィールド番号の値を出力する。

ex)

ls
2019-12-12T10:00:00_errorlog.txt    2019-12-14T08:30:00_applog.txt
2019-12-13T15:12:00_errorlog.txt    2019-12-14T10:40:00_applog.txt
2019-12-14T08:00:00_applog.txt      2019-12-14T16:52:00_errorlog.txt

$ ls | cut -d _ -f 1,2
2019-12-12T10:00:00_errorlog.txt
2019-12-13T15:12:00_errorlog.txt
2019-12-14T08:00:00_applog.txt
2019-12-14T08:30:00_applog.txt
2019-12-14T10:40:00_applog.txt
2019-12-14T16:52:00_errorlog.txt

$ ls | cut -d _ -f 1
2019-12-12T10:00:00
2019-12-13T15:12:00
2019-12-14T08:00:00
2019-12-14T08:30:00
2019-12-14T10:40:00
2019-12-14T16:52:00

$ ls | cut -d _ -f 2
errorlog.txt
errorlog.txt
applog.txt
applog.txt
applog.txt
errorlog.txt


diff:ファイルの差分表示

$ diff <比較元ファイル> <比較先ファイル>

比較元ファイルにだけある箇所は「<」と表示され、比較先ファイルにだけある箇所は「>」と表示される。

ex)

$ cat class1.txt
Sato
Miyamoto
Tanaka
Ogawa

$ cat class2.txt
Ogawa
Sato
Takei
Yamamoto

$ diff class1.txt class2.txt
1,3d0
< Sato
< Miyamoto
< Tanaka
4a2,4
> Sato
> Takei
> Yamamoto

$ diff -u class1.txt class2.txt
--- class1.txt  2019-03-17 13:56:37.000000000 +0900
+++ class2.txt  2019-03-17 13:56:37.000000000 +0900
@@ -1,4 +1,4 @@
-Sato
-Miyamoto
-Tanaka
 Ogawa
+Sato
+Takei
+Yamamoto

「-u」オプションをつけると、Githubのようにユニファイド形式で差分を表示してくれる。


grep:文字列検索

$ grep -n <検索パターン> <検索ファイル名>

検索ファイル内を検索パターンで検索する。

ex)

$ cat class1.txt class2.txt 
Sato
Miyamoto
Tanaka
Ogawa
Ogawa
Sato
Takei
Yamamoto

$ cat class1.txt class2.txt | grep '^T'
Tanaka
Takei

$ cat class1.txt class2.txt | grep -n '^T'
3:Tanaka
7:Takei
$ cat class1.txt class2.txt | grep -n '^T'

上の例では、「T」で始まる文字列をパターン検索している。「-n」オプションをつけると、検索結果を行数とともに表示する。

「-i」オプションをつけると大文字小文字を無視して検索してくれ、「-v」オプションをつけると検索パターンに該当しないものだけを表示する


sed:文字列置換して表示

$ sed <開始対象の行番号>,<終了対象の行番号>d <ファイル名>

行番号指定した行を削除した状態のファイルを標準出力に出力する。

ex)

$ cat class1.txt 
Sato
Miyamoto
Tanaka
Ogawa

$ sed 1,3d class1.txt 
Ogawa

$ cat class1.txt 
Sato
Miyamoto
Tanaka
Ogawa

置換されたものが標準出力に表示されるだけで、ファイルが更新される訳ではない。


$ sed 's/置換元/置換後/' <ファイル名>

指定したファイルの行の最初に見つかった置換元の文字列を置換後の文字列に変換する。

ex)

$ cat class1.txt 
Sato
Miyamoto
Tanaka
Ogawa

$ sed 's/a/A/' class1.txt 
SAto
MiyAmoto
TAnaka
OgAwa

$ sed 's/a/AAA/' class1.txt 
SAAAto
MiyAAAmoto
TAAAnaka
OgAAAwa

$ sed 's/a/AAA/g' class1.txt 
SAAAto
MiyAAAmoto
TAAAnAAAkAAA
OgAAAwAAA

$ sed 's!a!AAA!g' class1.txt 
SAAAto
MiyAAAmoto
TAAAnAAAkAAA
OgAAAwAAA

aがAAAに変換されて出力されていますね。「g」をつけると、行の最初の置換元だけでなく全ての置換元文字列を置換することができます。

置換元と置換後の文字列の区切り文字は「/」である必要はない。「s」の後ろにある文字列が区切り文字に指定されるから「/」の代わりに「!」とかでもいい。


awk:パターン検索と処理

$ awk -F, '{print $<列番号>, $<列番号>,...}' <ファイル名>

ファイルのカンマを区切り文字として指定し、指定した列番号の値を出力する。

ex)

$ cat testscore.csv 
1,Sato,Math,90
2,Sato,English,29
3,Tanaka,Math,69
4,Tanaka,English,78
5,Miyamoto,Math,89
6,Miyamoto,English,92

$ awk -F, '{print $2, $3, $4}' testscore.csv 
Sato Math 90
Sato English 29
Tanaka Math 69
Tanaka English 78
Miyamoto Math 89
Miyamoto English 92

$ cat testscore.csv | grep Math | awk -F, '{sum += $4} END{print $3"平均点:"sum/NR}'
Math平均点:82.6667

検索されたものが標準出力に表示されるだけで、ファイルが更新される訳ではない。

計算もできて便利。例では「sum」という変数に4列目の値を合計していき、サイドにsumをNR(行の数)で割って平均値を出力している。



参考図書

三宅さんの『新しいLinuxの教科書』が、コマンドの仕組みと使い方が例つきでわかりやすくまとまっている良書。


新しいLinuxの教科書
三宅 英明 (著)
SBクリエイティブ (出版)
2015-06-06 (発売日)

これ読みながら手を動かせば、ある程度コマンド頭に入るからおすすめです( ・v・)b


では!