テキストストリーム

 Linuxにはテキストデータを加工するためのテキストユーティリティコマンドが複数用意されている。これらのコマンドが処理する対象はテキストファイルのみならず、他のコマンドの出力も対象となり、これらをまとめて「テキストストリーム」と呼ぶ。


テキストファイル表示コマンド
cat [ファイル名] キャット
テキストストリーム全体を最初から順に表示
 -n:行番号をつけて表示
tac [ファイル名] タック
テキストストリーム全体を最後から逆順に表示
head [オプション] [ファイル名] ヘッド
ファイルの先頭(デフォルト10行)の表示
 -n 行数:先頭から表示する行数の指定
 -行数:同上
tail [オプション] [ファイル名] テイル
ファイルの末尾の表示
 -n 行数:末尾から表示する行数の指定
 -行数:同上
 -f:ファイルの末尾に追加される行を表示し続ける


$ cat lpic.txt ←「lpic.txt」の内容表示
 LPI
 Linux Professional Institute
 Level 1
  101
  102
 Level 2
  201
  202
 Level 3
  321
  322
  323
  324
  325
  32x
 ↑内容が全て表示される

$ cat -n lpic.txt ←行番号付きで表示
   1 LPI
   2 Linux Professional Institute
   3 Level 1
   4  101
   5  102
   6 Level 2
   7  201
   8  202
   9 Level 3
  10  321
  11  322
  12  323
  13  324
  14  325
  15  32x
  ↑行番号

$ tac lpic.txt ←内容を逆順に表示
  32x
  325
  324
  323
  322
  321
 Level 3
  202
  201
 Level 2
  102
  101
 Level 1
 Linux Professional Institute
 LPI

$ head lpic.txt ←内容の先頭のみ表示
 LPI
 Linux Professional Institute
 Level 1
  101
  102
 Level 2
  201
  202
 Level 3
  321

$ head -n 3 lpic.txt ←先頭3行を指定して内容表示
 LPI
 Linux Professional Institute
 Level 1

$ head -3 lpic.txt ←同上
 LPI
 Linux Professional Institute
 Level 1

$ tail lpic.txt ←内容の末尾のみ表示
 Level 2
  201
  202
 Level 3
  321
  322
  323
  324
  325
  32x

$ tail -n 3 lpic.txt ←末尾3行を指定して内容表示
  324
  325
  32x

$ tail -3 lpic.txt ←同上
  324
  325
  32x



テキストストリームの加工

split [オプション] [入力ファイル名] [出力フィル名] スプリット
ファイルの分割(デフォルト1000行)
※出力ファイルの拡張子は.aa、.ab…と付けられ保存される
 -行数:分割する行数の指定
cut [オプション] [ファイル名] カット
各行が特定の区切り文字(デリミタ)で複数のフィールドに分割されているファイル(CSVファイル等)の中から特定のフィールドを抜き出す
 -d区切り文字:区切り文字のの指定(デフォルトはタブ)
 -fフィールド(,フィールド):抜き出すフィールドの指定
paste [オプション] ファイル名1 ファイル名2 ペースト
同じ行毎にファイルの連結を行う
 -d区切り文字:区切り文字の指定(デフォルトはタブ)
sort [オプション] [+開始位置[-終了位置]] [ファイル名] ソート
行単位でソートして表示(デフォルトは昇順)
 -b:行頭が空白ならば、その行を無視する
 -f:大文字と小文字の区別をしない
 -n:数字は数値とする
 -r:降順にソートする
uniq [オプション] [入力ファイル] [出力ファイル] ユニーク
重複行を1行にまとめて表示する
 -d:重複行のみを出力
※uniqを行う場合は、あらかじめソートされたテキストストリームで行う
expand [ファイル名] エクスペンド
ファイル内タブをスペースに変換する
 -数字:タブを指定した数のスペースへ変換
 -i:行頭のみ変換する
unexpand [ファイル名] アンエクスペンド
ファイル内の行頭のスペースをタブに変換する
 -数字:指定した数のスペースをタブに変換する
 -a:行頭以外のスペースも変換する
tr [オプション] [文字列1[文字列2]]
文字列1を検索し、それを削除、もしくは文字列2に置き換える
 -d:マッチした文字列の削除
※文字クラス:文字列の代わりに、文字の種類を指定
 [:alpha:]:英字(大文字/小文字)
 [:lower:]:英小文字
 [:upper:]:英大文字
 [:digit:]:数字
 [:alnum:]:英数字
 [:space:]:スペース
 '' :範囲指定 例)'a-h'小文字のa〜hのいずれか。'a-zA-Z'=[:alpha:]
join [オプション] ファイル名1 ファイル名2
2つのファイルの共通のフィールドを横に連結する
 -j フィールド:連結するフィールドの指定
fmt [オプション] [ファイル名]
行の連結や隙間を埋めるなど、各行を指定した文字数にそろえる
 -w 文字数:1行の文字数の指定
pr [オプション] [ファイル名]
ファイルの印刷時などに、1行の文字数に加え行数もそろえる
 -w 文字数:1ページあたりの文字数の指定
 -l 行数:1ページあたりの行数の指定
nl [オプション] [ファイル名]
行番号を付けて表示する
 -b 形式:行番号形式の指定(a:全ての行、t:空白以外の行)
od [オプション] [ファイル名]
ファイルの内容を8進数もしくは16進数などで表示する(デフォルトは8進数)
 -t タイプ:表示タイプの指定(o:8進数、x:16進数) 


$ ls lpic.*
 lpic.txt
$ cat lpic.txt
 LPI
 Linux Professional Institute
 Level 1
 101
 102
 Level 2
 201
 202
 Level 3
 321
 322
 323
 324
 325
 32x
  ←改行のみ(文字列無し)
$ split -3 lpic.txt lpic. ←3行毎にファイルの分割
$ ls lpic.*
 lpic.aa lpic.ab lpic.ac lpic.ad lpic.ae lpic.af lpic.txt ←拡張子が「aa」〜「af」に分割されている
$ cat lpic.aa
 LPI
 Linux Professional Institute
 Level 1 ←3行毎に分割されている
$ cat lpic.ab
 101
 102
 Level 2
$ cat lpic.ac
 201
 202
 Level 3
$ cat lpic.ad
 321
 322
 323
$ cat lpic.ae
 324
 325
 32x
$ cat lpic.af
  ←改行だけでも1行とみなす
$



$ cat lpic.aa lpic.ab lpic.ac lpic.ad lpic.ae lpic.af > lpic.tx1
 ↑分割されたファイルはcatコマンドでファイル標準出力すれば結合可能
$ ls lpic.*
 lpic.aa lpic.ab lpic.ac lpic.ad lpic.ae lpic.af lpic.tx1 lpic.txt
                             ↑結合されている
$ cat lpic.tx1
 LPI
 Linux Professional Institute
 Level 1
 101
 102
 Level 2
 201
 202
 Level 3
 321
 322
 323
 324
 325
 32x
  ←内容も元通り
$ cat lpic.a* > lpic.tx2 ←ファイルが多い場合はワイルド・カードで全てを指定
$ ls lpic.*
 lpic.aa lpic.ac lpic.ae lpic.tx1 lpic.txt
 lpic.ab lpic.ad lpic.af lpic.tx2 ←結合されている
$ cat lpic.tx2
 LPI
 Linux Professional Institute
 Level 1
 101
 102
 Level 2
 201
 202
 Level 3
 321
 322
 323
 324
 325
 32x
 
$


$ cat lpic.csv
lpic1  101   102
lpic2:201:202
lpic3 321 322 323 324 325 32x
$ cut -f1 lpic.csv ←デフォルト「タブ」区切りによるフィールドの1つめを表示
lpic1
lpic2:201:202
lpic3 321 322 323 324 325 32x
$ cut -d: -f2,3 lpic.csv ←「:」区切りによる2,3つめ
lpic1  101   102 ←指定された区切り文字が無い行は、そのまま表示
201:202 ←区切り文字が付いたまま、指定された2と3行目が表示
lpic3 321 322 323 324 325 32x
$ cut -d' ' -f8 lpic.csv
lpic1  101   102
lpic2:201:202
←8つめの項目は無いので、表示されない
$


$ cat lpic_1.txt
 Linux
 Professional
 Institute
 Level 1
 Level 2
 Level 3
$ cat lpic_2.txt
 101
 102
 201
 202
 321
 322
 323
 324
 325
 32X
$ paste lpic_1.txt lpic_2.txt
 Linux  101 ←行毎にタブで区切られて連結されている
 Professional  102
 Institute    201
 Level 1 202
 Level 2 321
 Level 3 322
     323
     324
     325
     32X
$ paste -d';' lpic_1.txt lpic_2.txt ←区切り文字に「;」を指定
 Linux;101 ←「;」で区切られている
 Professional;102
 Institute;201
 Level 1;202
 Level 2;321
 Level 3;322
 ;323
 ;324
 ;325
 ;32X
$


$ cat sortdata.txt
 LPIC
  LPI Linux
  101
  102
 level 1
  202
  201
 LEVEL 2
  325
  32X
 Level 3
 323
 321
 322
 
 1
 2
 3
 10
 11
 12
$ sort sortdata.txt ←デフォルトでソート
  ←空白は先頭にくる
  101 ←先頭はスペースの為、数字よりも先にくる
  102
  201
  202
  325
  32X
  LPI Linux
 1
 10
 11
 12
 2
 3
 321
 322
 323
 LEVEL 2
 LPIC
 Level 3 ←大文字は小文字よりも先にくる
 level 1
$ sort -bf sortdata.txt ←先頭のスペースを無視し、大文字・小文字の区別をしない
 
 1
 10
  101
  102 ←文字が「1」「0」の順であるため、「1」「1」よりも先になる
 11
 12
 2
  201
  202  3
 321
 322
 323
  325
  32X
 level 1
 LEVEL 2 ←大文字・小文字の区別をしない為、先頭5文字は同じと見なされる
 Level 3
  LPI Linux
 LPIC
$ sort -bnr sortdata.txt ←先頭のスペースを無視し、数字は数値として扱い、かつ降順で並べる
  325 ←数値の「325」として扱う為、「323」よりも先(降順)
 323
 322
 321
  202
  201
  102
  101
  32X ←数値「32」として扱う為、「101」よりも小さいと判断される
 12
 11
 10
 3
 2
 1
 level 1
 Level 3
 LPIC
 LEVEL 2
  LPI Linux
 
$


$ cat uniqdata.txt
 101
 102
 102
 201
 202
 321
 321
 322
 323
 323
 323
 324
 325
 325
 325
 32X
 32X
$ uniq uniqdata.txt uniqdata_u.txt ←重複行を1つにまとめる
$ cat uniqdata_u.txt
 101
 102
 201
 202
 321 ←全種類が出力されている
 322
 323
 324
 325
 32X
$ uniq -d uniqdata.txt uniqdata_u.txt ←重複行のみ抜き出し
$ cat uniqdata_u.txt
 102
 321
 323 ←重複してない行は出力されない
 325
 32X
$


$ cat tab.txt
 1    2    3    4    5
  ↑タブ
$ expand -1 tab.txt ←タブを1文字のスペースへ変換
 1 2 3 4 5
$ expand -2 tab.txt ←タブを2文字のスペースへ変換
 1 2 3 4 5 ←1文字のスペースに変換された(調査中)
$ expand -3 tab.txtt ←タブを3文字のスペースへ変換
 1 2 3 4 5 ←2文字のスペースに変換された(調査中)
$ expand -4 tab.txt
 1  2  3  4  5 ←指定した数値からマイナス1された数になる?(調査中)
$ cat tab2.txt
     1    2    3    4    5
$ expand -i -2 tab2.txt ←先頭のタブのみ、2文字のスペースに変換
  1   2    3    4    5
 ↑変換されている
$


$ cat space.txt
 1 2 3 4 5
$ unexpand -1 -a space.txt ←1文字のスペースを1つのタブに変換する
 1 2 3      4        5
     ↑2文字のスペースのみ、2つのタブに変換された(調査中)
$ cat space2.txt
  1 2 3 4 5
$ unexpand -2 space2.txt ←先頭のスペース2文字につき、1つのタブに変換する
     1 2 3 4 5
   ↑タブ(1つ)
$ unexpand -1 space2.txt ←先頭のスペース1文字につき、1つのタブに変換する
         1 2 3 4 5
   ↑タブ(2つ)
$


テキストストリーム情報の表示
wc [オプション] [ファイル名] ダブルシー
テキストストリームの行数、単語数、バイト数を表示する(オプション無しで全て表示)
 -l:行数を表示する
 -c:バイト数を表示する
 -w:単語数を表示する


$ cat lpic.txt
 LPI
 Linux Professional Institute
 Level 1
 101
 102
 Level 2
 201
 202
 Level 3
 321
 322
 323
 324
 325
 32x
 
$ wc lpic.txt
 16 20 98 lpic.txt ←左から順に「行数」「単語数」「バイト数」が表示
$ wc -c lpic.txt ←バイト数のみ表示
 98 lpic.txt
$