LPIC-1 - 101試験 - 103:GNUとUnixのコマンド - 103.2 フィルタを使ってテキストストリームを処理する

Last Update : September 06 2018 17:26:57

     

a. テキスト処理フィルタ

1.ファイルの内容を表示する[ cat ]

cat コマンドは、ファイルの内容を表示します。複数のファイルを連結して出力することもできます。

$ cat -n file1

file1とfile2を連結して、file3に出力します。

$ cat file1 file2 > file3

● cat コマンド構文
 cat [オプション] [ファイル名...]

● cat コマンドオプション
 -b 先頭行から、空白行を含めずに行番号をつけて表示します
 -n 先頭行から、すべての行に行番号をつけて表示します
 -s 連続した空行を1行の空行にまとめて表示します
 -v タブを「~」に、表示不可能な文字(最上位ビットが1の文字)を「M-」に置き換えて表示します


2.ファイルの内容を逆順に表示する[ tac ]

tac コマンドは、ファイルの内容を行を逆順にして表示します。複数のファイルを連結して逆順に出力することもできます。
行(レコード)はセパレータ文字列によって分離されます (デフォルトは改行文字)。 デフォルトでは、セパレータ文字列は (入力ファイル中で後置されていた) 行の最後に付加されて出力されます。
コマンドの意味どおりcatコマンドと表示が逆になります。コマンドを実行する際には、引数に表示したいファイルを指定して実行します。また、tacはコマンドのつづりもcatの逆になっています。

$ tac file1

file1とfile2を連結して、file3に出力します。

$ tac file1 file2 > file3

● tac コマンド構文
 tac [オプション] [ファイル名...]

● tac コマンドオプション
 -b セパレータ文字列を (入力ファイル中で前置されていた) レコードの先頭に付加します
 -r セパレータ文字列を正規表現として取り扱います
 -s SEPARATOR 改行文字の代わりに、 SEPARATORで指定された文字をレコードのセパレータに用います
 --version 標準出力にバージョン情報を出力して正常終了します


3.ファイルの内容に行番号をつけて表示する[ nl ]

nl コマンドはテキストファイルの一部または全部に行番号を付加して標準出力(画面)に出力します。
nlコマンドはテキストファイルを論理ページとみなします。論理ページはヘッダ (header)、本文 (body)、フッタ (footer) の3つのセクションから構成されます。セクションは空であってもかまいません。それぞれのセクションは以下に示すような特殊な行により分けられます。

  • ヘッダの開始を意味する行・・・ \:\:\:
  • 本文の開始を意味する行・・・ \:\:
  • フッタの開始を意味する行・・・ \:

入力を論理ページ (logical page) に分解します。デフォルトでは、 行番号は各々の論理ページの先頭で 1 にリセットされます。 nl は入力されたファイルすべてをまとめてひとつの文書とみなし処理します。 したがってファイルの切れ目でも行番号や論理ページはリセットされません。


● nl コマンド構文
 nl [オプション] [ファイル名]

● nl コマンドオプション
 -h形式 指定した形式でヘッダに行番号を付加します
 -b形式 指定した形式で本文に行番号を付加します
 -f形式 指定した形式でフッタに行番号を付加します

● nl 形式
 a 全ての行
 t 空白以外の行
 n 行番号を付加しない

● nl コマンドによる行番号の付加
$ cat test.txt \:\:\: ここはヘッダーです \:\: ここは本文です \: ここはフッターです $ nl -ht -bt -ft test.txt 1 ここはヘッダーです 2 ここは本文です 3 ここはフッターです $ nl -ha -ba test.txt 1 ここはヘッダーです 2 3 ここは本文です 4 ここはフッターです


4.バイナリファイルの内容を表示する[ od ]

od コマンドはバイナリファイルの内容を8進数(デフォルト)や16進数などで表示します。


● od コマンド構文
 od [オプション] [ファイル名]

● od コマンドオプション
 -t出力形式 出力するフォーマットを指定する
 -Nバイト数 入力ファイルを指定したバイト数まで表示します

● od 出力形式
 c ASCII文字
 o 8進数
 x 16進数

$ od -N1 -tc /etc/localtime 0000000 T 0000001 $ od -N1 -to /etc/localtime 0000000 00000000124 0000001 $ od -N1 -tx /etc/localtime 0000000 00000054 0000001


5.ファイルの先頭部分を表示する[ head ]

head コマンドはテキストファイルの先頭部分を表示するコマンドです。オプションで行数を指定しない場合は、先頭から10行までを表示します。


● head コマンド構文
 head [オプション] [ファイル名]

● head コマンドオプション
 -c <バイト数> 出力するバイト数を指定します
 -<行数>
-n <行数>
出力する行数を指定します

$ head -5 test.txt \:\:\: ここはヘッダーです \:\: ここは本文です


6.ファイルの末尾部分を表示する[ tail ]

tail コマンドはテキストファイルの末尾部分を表示するコマンドです。オプションで行数を指定しない場合は、最終行から10行までを表示します。 -fオプションを使うと、ファイルの末尾を表示し続け、ファイルの末尾に行が追加された場合でも、リアルタイムで表示してくれます。


● tail コマンド構文
 tail [オプション] [ファイル名]

● tail コマンドオプション
 -c<バイト数> 出力するバイト数を指定する
 -<行数>
-n<行数>
出力する行数を指定する
 -f リアルタイムで表示する

$ tail -n3 test.txt \: ここはフッターです


7.ファイルから指定したフィールドを抽出する[ cut ]

cut コマンドは-cオプションで文字位置を指定した場合、ファイルの各行から指定した文字位置の文字を取り出します。文字位置は一番左の文字を「1」とします。「-」を使用して文字位置の範囲を指定することもできます。

CSVファイルやTSVファイルのように、区切り文字(デリミタ)で区切られたテキストから任意のフィールドを取り出すには、-dオプションで区切り文字を、-fオプションで取り出したいフィールドを指定します。フィールドは一番左のフィールドを「1」とします。
フィールドの指定は「-」を使用して範囲を指定したり、「,」を使用して複数のフィールドを指定したりできます。


● cut コマンド構文
 cut [オプション] [ファイル名]

● cut コマンドオプション
 -c 文字位置 取り出す文字位置を指定する
 -d 区切り文字 フィールドの区切り文字を指定する。指定を省略すると、タブが区切り文字となります。
 -f フィールド 取り出すフィールドを指定する

$ cat test.csv yoshida,tadashi,tokyo,03-1234-5678 yamanaka,yoshiko,osaka,06-1111-3333 $ cut -d , -f 2 test.csv tadashi yoshiko $ cut -d , -f 2-4 test.csv tadashi,tokyo,03-1234-5678 yoshiko,osaka,06-1111-3333


8.二つのファイルを読み、フィールドが共通な行を結合する[ join ]

join コマンドは2つのファイルを読み込み、結合キーとなるフィールドで行を連結して標準出力(画面)に出力します。
ここでいうフィールドとは、1行を行中の(1つ以上の)スペースまたはタブで分割したときの個々の要素のことを指し、一番左のフィールド番号を「1」とします。


● join コマンド構文
 join [オプション] [ファイル名1] [ファイル名2]

● join コマンドオプション
 -j フィールド番号 結合キーとなるフィールド番号を指定する
 -1 フィールド番号 ファイル1の結合キーとなるフィールド番号を指定する
 -2 フィールド番号 ファイル2の結合キーとなるフィールド番号を指定する

$ cat test2a.txt 1 tokugawa 2 oda 3 toyotomi $ cat test2b.txt 1 ieyasu 2 nobunaga 3 hideyoshi $ join -j 1 test2a.txt test2b.txt 1 tokugawa ieyasu 2 oda nobunaga 3 toyotomi hideyoshi

出力フォーマットは、joinフィールド、ファイル1の残りのフィールド、ファイル2の残りのフィールドがスペースで区切られて出力されます。
-1オプションおよび-2オプションを使用して、ファイル1とファイル2で別々のフィールドをキーとして指定することもできます。

$ cat test2a.txt 1 tokugawa 2 oda 3 toyotomi $ cat test2c.txt ieyasu 1 nobunaga 2 hideyoshi 3 $ join -1 1 -2 2 test2a.txt test2c.txt 1 tokugawa ieyasu 2 oda nobunaga 3 toyotomi hideyoshi


9.ファイルを行単位で結合する[ paste ]

paste コマンドは複数のファイルを読み取って、それぞれで行番号が一致する行を水平方向に連結し、標準出力(画面)に出力します。
「-d」オプションで、連結する際の区切り文字を指定できますが、このオプションを省略するとタブで連結されます。


● paste コマンド構文
 paste [オプション] [ファイル名1] [ファイル名2] ・・・

● paste コマンドオプション
 -d 区切り文字 区切り文字(デリミタ)を指定する
 -N バイト数 入力ファイルを指定したバイト数まで表示します

$ paste -d ":" test2a.txt test2b.txt 1 tokugawa:1 ieyasu 2 oda:2 nobunaga 3 toyotomi:3 hideyoshi

区切り文字は1文字です。2文字以上の文字列を指定すると、1文字目が区切り文字として使用され、2文字目以降は無視されます。
区切り文字を指定する際はダブルクォーテーションでくくります(例えばセミコロン「;」など、文字によってはくくらないとエラーとなるため、常にくくっておいたほうが無難です)。



10.入力文字列を変換・削除して出力する[ tr ]

tr コマンドは標準入力から読み取った文字列を変換・削除して標準出力(画面)に出力します。
文字を変換し、オプションで指定すればさらに連続する文字を圧縮 (squeeze) します。
連続する文字を圧縮します。
文字を削除します。
文字を削除してから、連続する文字を圧縮します。


● tr コマンド構文
 tr [オプション] [文字セット1 [文字セット2]]

● tr コマンドオプション
 -d 文字セット1でマッチした文字を削除する
 -s 文字セット1でマッチした文字が連続する場合1文字にする

● trで使えるクラス
 [:alpha:] 英文字
 [:lower:]
英小文字
 [:upper:] 英大文字
 [:digit:] 数字
 [:alnum:] 英数字
 [:space:] スペース

下記の例では-dオプションを使用して文字「m」または「a」を削除しています(文字列「ma」を削除するという意味ではない点に注意してください)。

$ tr -d "ma" My name is kawamoto  <--- この文字列を入力してEnterを押すと My ne is Kwoto   <--- この文字列を表示する    <--- Ctrl + c で終了 $

ホームディレクトリのtest.txtの英小文字を全て英大文字に変えたものをtest2.txtに出力するには、

$ cat /home/sakura/test.txt | tr 'a-z' 'A-Z' > /home/sakura/test2.txt または、 $ cat /home/sakura/test.txt | tr [:lower:] [:upper:] > /home/sakura/test2.txt

注意すべき点は、tr コマンドは他の多くのテキスト処理コマンドと異なり、ファイル名を引数にとらないということです。
ファイルの内容を変換・削除して標準出力(画面)に出力したい場合は、パイプ「|」を使います。下記の例ではcatコマンドでtest.txtの内容を出力しますが、その出力をパイプによってtrコマンドの入力として渡しています。

$ cat test1.txt aaacccccbbbb
$ cat test1.txt | tr -s "abc" acb $


11.行単位でファイルの内容をソートして表示する[ sort ]

sort コマンドは行単位でファイルの内容をソートし、標準出力(画面)に出力します。
ソートをするからには、各行のどの部分を基準にソートするか(例えば各行の先頭1文字を基準にソートするなど)を指定しなければなりません。
sortコマンドにおけるソート基準文字列の開始位置や終了位置の指定は、フィールドとフィールド内での文字位置の両方を指定します。
まずフィールドですが、これはTSV(タブ区切り)やCSV(カンマ区切り)などをそれぞれのセパレータ(タブやカンマ)で分割したときの各要素のことです。普通のテキストの場合はフィールド数が一つとみなすことができます。フィールドの指定は一番左のフィールドを「0」(その次を「1」、「2」…)とします。
次にフィールド内での文字位置の指定ですが、これはフィールドの一番左の文字を「0」(その次を「1」、「2」…)とします。
そしてこの2つの数値を「.」(ピリオド)で連結して指定します。


● sort コマンド構文
 sort [オプション] [ファイル名・・・]

● sort コマンドオプション
 +開始[ -終了] ソート基準文字列フィールドの番号を指定する。開始フィールドから終了フィールドの直前のフィールドの最後の文字までをソート対象とする。終了フィールドは含まない。位置はf.cの形をとり、fがフィールドの番号をcはそのフィールド内での文字位置を表す。フィールドと文字位置はそれぞれ 0 から数えはじめる。
 -t [文字] フィールド区切り文字(セパレータ)を指定する。デフォルトはスペース
 -b 行頭の空白を無視する
 -f 大文字と小文字を区別しない
 -r 降順にソートする
 -n 数字を文字ではなく数値として処理する
 -k 開始[,終了] 各行でソート対象となるキーの場所を指定する。開始から終了までをソートフィールドとする。開始だけを書いた場合は、開始から最後までをソートフィールドとします。位置はf.cの形をとり、fがフィールドの番号をcはそのフィールド内での文字位置を表す。ただし、フィールドと文字位置はそれぞれ 1 から数えはじめる。cを省略した場合はフィールドの先頭からとする。
 -u 同一キーであるフィールドが複数行存在する場合、1行だけ出力する
 -M 先頭に現れた3文字を月表記とみなしてソートする。ただし、先頭にある空白は無視する

text-fileを大文字小文字関係なくソートする場合

$ sort -f text-file

CSV ファイルのように列の区切り文字が空白でないときは 次のように "-t" オプションで区切り文字を指定できます。

$ sort -k 2,2 -n -r -t "," text-file

デフォルトでは昇順にソートされます。
終了位置を指定しないと文末までがソート基準文字列となります。
終了位置を指定した場合、終了位置の文字の直前までがソート基準文字列となります。
フィールドだけを指定し、フィールド内での文字位置の指定を省略すると、そのフィールドの先頭の文字が指定されたことになります。



12.入力ファイルの内容を分割し、複数のファイルを生成する[ split ]

split コマンドは、オプションで指定された行ごとに入力ファイルを分割し、結果を複数のファイルに書き込みます(その際、入力ファイルは変更されません)。
デフォルトでは、 split コマンドは FILE のうちの 1000 行ずつ (1000 行に満たない場合は残り全部) を各出力ファイルに書き込みます。
出力されるファイル名はコマンドラインで指定したプレフィックスの末尾に、「aa」、「ab」、「ac」 … を付加したものとなります。
プレフィックスを指定しない場合のデフォルト値は「x」です。よって生成されるファイル名は「xaa」、「xab」、「xac」 … となります。


● split コマンド構文
 split [オプション] [入力ファイル名 [プレフィックス]]

● split コマンドオプション
 -行数 ファイルを何行ごとに分割するかを指定する
 -b バイト数[単位] 指定したバイト数で分割し、出力する。数字の後に記号を付加することにより単位を変えることができる。kはKバイトmはMバイト
 -a 文字数 分割したファイル名に付与する文字数を指定します。 -1 であれば 「a」 -2 であれば 「aa」 がファイル名に付与されます。

ファイルText01.txtを5行ずつ分割し、それぞれをファイルfile1.aa , file1.ab ・・・に出力します。

$ split -5 -a 2 Text01.txt file1. $ ls Text01.txt file1.aa fole1.ab file1.ac


13.ファイルから重複行を取り除きます[ uniq ]

uniq コマンドはテキストファイルの重複している行を1行にまとめて標準出力(画面)に出力します。
このコマンドは他の多くのテキスト処理コマンドと異なり、引数に出力ファイル名を指定することができます(他の多くのテキスト処理コマンドの場合、結果をファイルに保存するにはリダイレクトを使います)。
このコマンドを使用する際は、テキストファイルを事前にソートしておく必要があります。重複行が隣り合っていないとうまく機能しないのです。


● uniq コマンド構文
 uniq [オプション] [入力ファイル名 [出力ファイル名]]

● uniq コマンドオプション
 -d 重複している行のみ出力する
 -u 重複していない行のみ出力する
 -c 重複している行を出力すると同時にそれぞれの重複回数も表示する

$ cat sample.txt abcde abcde abcde abcdef abcdefg abcdefg $ uniq sample.txt abcde abcdef abcdefg $ uniq -c sample.txt 3 abcde 1 abcdef 2 abcdefg


14.印刷のためにファイルを整形します[ pr ]

pr コマンドは印刷のためにファイルを整形し、標準出力(画面)に出力します。
ファイル名に「-」を指定すると標準入力から読み取ります。
デフォルトでは、それぞれのページに5行のヘッダがつきます。ヘッダは2行の空行、日付・ファイル名・ページ番号の行、2行の空行から構成されます。各ページの末尾には全て空行の5行のフッタも出力されます。


● pr コマンド構文
 pr [オプション] [ファイル名]

● pr コマンドオプション
 +開始[:終了] 開始ページや終了ページを指定する
 -hヘッダ文字列 ヘッダに表示する文字列を指定する
 -l行数 1ページあたりの行数を指定する
 -W文字数 1行あたりの文字数を指定する

・「-l」オプションを指定しない場合のデフォルトの行数は66行です。
・「-W」オプションを指定しない場合のデフォルトの文字数は72文字です。
・「-l」オプションで指定する行数はヘッダ行とフッタ行を含めた行数です。

1ページ20行で出力します。

$ pr -l20 sample.txt 2013-04-14 15:20 sample.txt Page 1 abcde abcdefg abcdef abcde abcdefg abcde


15.ファイルを指定した桁に整形します[ fmt ]

fmt コマンドはテキストファイルを-wオプションで指定した幅(デフォルトは75桁)に整形し、標準出力(画面)に出力します。
例えば「-w 1」と指定した場合、1行の幅を1桁としますが、単語は分割されません。


● fmt コマンド構文
 fmt [オプション] [ファイル名]

● fmt コマンドオプション
 -w 行幅 1行の幅を指定する
 -s 行の分割のみ行い、結合はしない

各行に入力されているテキストの幅と比較して、オプションで指定した幅が広い場合には、行の結合が行われます。

$ fmt -w30 sample.txt abcde abcdefg abcdef abcde abcdefg abcde


16.タブをスペースに変換します[ expand ]

expand コマンドはテキストファイルの中にあるタブをスペースに変換し、標準出力(画面)に出力します。デフォルトでは「1タブ=8スペース」として変換されるため、見ただけでは違いがわかりません。-tオプションでタブ幅を指定すると違いがわかります。
このコマンドは元ファイルを変更しません。スペースをタブに変換した結果を別のファイルとして保存したい場合は、リダイレクトを使用します。


● expand コマンド構文
 expand [オプション] [ファイル名]

● expand コマンドオプション
 -i 行頭のタブのみを変換する
 -t <タブ幅> タブ幅(1つのタブがスペース何個に相当するか)を指定する

$ cat sample2.txt
a b c d e f g h
$ expand -t 3 sample2.txt
a b c d e f g h
$ expand -t 10 sample2.txt
a b c d e f g h


17.スペースをタブに変換します[ unexpand ]

unexpand コマンドはテキストファイルの中にあるスペースをタブに変換し、標準出力(画面)に出力します。デフォルトでは行頭のスペース8個がタブ1個に変換されます。
このコマンドは元ファイルを変更しないという点です。スペースをタブに変換した結果を別のファイルとして保存したい場合は、リダイレクトを使用します。


● unexpand コマンド構文
 unexpand [オプション] [ファイル名]

● unexpand コマンドオプション
 -a 行頭以外のスペースも変換する
 -t <タブ幅> タブ幅(1つのタブがスペース何個に相当するか)を指定する


$ cat sample3.txt
a b c d e f g h
$ unexpand sample3.txt
a b c d e f g h


18.ファイルの行数、単語数、文字数を表示します[ wc ]

wc コマンドはテキストファイルの行数、単語数、文字数をこの順番で標準出力(画面)に出力します。
文字数(バイト数)には、改行コードやEOFも含まれます。


● wc コマンド構文
 wc [オプション] [ファイル名]

● wc コマンドオプション
 -l 行数のみを表示する
 -w 単語数のみを表示する
 -c 文字数(バイト数)のみを表示する
 --bytes バイト数のみを表示する
 --chars 文字数のみを表示する

sample.txtの行数、単語数、バイト数をそれぞれ表示する場合

$ wc sample.txt 6 6 41 sample.txt


z. 出題範囲概要

●説明 テキストストリームにフィルタを適用する。
●主要な知識範囲
テキストファイルやストリームの出力をテキストユーティリティフィルタに送り込み出力を変更するために、GNU textutilsパッケージに含まれる標準的なUNIXコマンドを使用する。
●重要なファイル、用語、ユーティリティ
cat, cut, expand, fmt, head, od, join, nl, paste, pr, sed, sort, split, tail, tr, unexpand, uniq, wc


  [ 例題 ] 
  1. 101:103.2 問01  タブをスペースに変換する
  2. 101:103.2 問02  タブ文字をスペースに変換
  3. 101:103.2 問03  /var/log/messagesへのログ出力
  4. 101:103.2 問04  文字列の変換
  5. 101:103.2 問05  末尾を表示する
  6. 101:103.2 問06  重複行の削除
  7. 101:103.2 問07  重複行の削除
  8. 101:103.2 問08  テキスト表示
  9. 101:103.2 問09  sort
  10. 101:103.2 問10  フィールドの取り出し


     

www.it-shikaku.jp