目次


Linux テキスト・ユーティティーでデータ抽出を簡易化する

最もよく使われているコマンドライン・テキスト・ツールの概要

Comments

Linux オペレーティング・システムには、構成ファイル、テキスト・ファイル、文書ファイル、ログ・ファイル、ユーザー・ファイルなど、多数のファイルが詰め込まれています。ほとんどの場合、これらのファイルには重要なデータを検索するためにアクセスしなければならない情報が含まれています。ファイルのコンテンツは大抵、cat、more などの標準ユーティリティーを使って簡単にスクリーンにダンプすることができますが、関連する値だけをフィルタリングして解析するには、それより適したユーティリティーがあります。

この記事を読んで、今までの殻を破って各ユーティリティーの例を試してください。

正規表現

本題に入る前に、正規表現とは何か、そしてその使用方法を理解する必要があります。

最も単純な形式の正規表現は、ファイル内のテキストを見つけるための検索基準です。例えば、「admin」という単語が含まれるすべての行を検索するには、「admin」を検索します。つまり、「admin」が正規表現です。「admin」を検索するだけでなく、これを「root」に置換する場合は、「admin」を「root」に置換するための適切なコマンドをユーティリティーに指定します。この場合は、両方の単語で正規表現が構成されます。

正規表現には、以下の基本ルールが適用されます。

  • 単一の文字、または上記の「admin」の例のように一連の文字自体を一致の条件として使用できます。
  • キャレット記号 (^) は行の始まりを意味し、ドル記号 ( $ ) は行の終わりを意味します。
  • ドル記号などの特殊文字をそのまま検索するには、特殊文字の前にバックスラッシュ (\) を付けます。例えば、\$ は行の終わりを表すのではなく、$ を検索します。
  • ピリオド (.) は任意の単一文字を表します。例えば、ad..n は最初の 2 文字が「ad」、最後の 1 文字が「n」の 5 文字のエントリーを表します。その中間は任意の文字ですが、2 文字に限ります。
  • 正規表現がスラッシュで囲まれている場合 (/re/ など) は常に、ファイルを順方向で検索します。引用符で囲まれている場合 (?re? など) は、ファイルを逆方向で検索します。
  • 大括弧 ([]) は複数の値を意味し、マイナス記号 (-) は値の範囲を示します。例えば、[0-9][0123456789] と同じことで、[a-z] は任意の小文字を検索します。リストの先頭文字がキャレットの場合、リストに含まれない任意の文字と一致します。

表 1 に、上記の一致条件が実際にどのように機能するかを示します。

表 1. 正規表現の例
説明
[abc]「a」、「b」、「c」のいずれかと一致します。
[a-z]「a」から「z」のいずれかの小文字と一致します。
[A-Z]「A」から「Z」のいずれかの大文字と一致します。
[0-9]0 から 9 のいずれかの数字と一致します。
[^0-9]0 から 9 以外の任意の文字と一致します。
[-0-9]0 から 9 のいずれかの数字、またはダッシュ ("-") と一致します。
[0-9-]0 から 9 のいずれかの数字、またはダッシュ ("-") と一致します。
[^-0-9]0 から 9 の数字またはダッシュ ("-") 以外の文字と一致します。
[a-zA-Z0-9]任意の英数字と一致します。

上記の情報をふまえた上で、ユーティリティーを検討してみましょう。

grep

grep ユーティリティーはファイル (複数可) の各行で、指定されたストリングの最初のオカレンスを検索します。 ストリングが見つかるとその行がプリントされます。見つからなかった場合はプリントされません。「memo」と名付けた以下のファイルで、grep の使用方法と結果を説明します。

To: All Employees

From: Human Resources

In order to better serve the needs of our mass market customers, ABC Publishing is integrating the groups selling to this channel for ABC General Reference and ABC Computer Publishing. This change will allow us to better coordinate our selling and marketing efforts, as well as simplify ABC's relationships with these customers in the areas of customer service, co-op management, and credit and collection. Two national account managers, Ricky Ponting and Greeme Smith, have joined the sales team as a result of these changes.

To achieve this goal, we have also organized the new mass sales group into three distinct teams reporting to our current sales directors, Stephen Fleming and Boris Baker. I have outlined below the national account managers and their respective accounts in each of the teams. We have also hired two new national account managers and a new sales administrator to complete our account coverage. They include:

Sachin Tendulkar, who joins us from XYZ Consumer Electronics as a national account manager covering traditional mass merchants.

Brian Lara, who comes to us via PQR Company and will be responsible for managing our West Coast territory.

Shane Warne, who will become an account administrator for our warehouse clubs business and joins us from DEF division.

Effectively, we have seven new faces on board:

1. RICKY PONTING
2. GREEME SMITH
3. STEPHEN FLEMING
4. BORIS BAKER
5. SACHIN TENDULKAR
6. BRIAN LARA
7. SHANE WARNE

Please join me in welcoming each of our new team members.

簡単な例として、「welcoming」という語句が含まれている行を検索してみます。最適な方法は、以下のコマンドラインを使用することです。

# grep welcoming memo
Please join me in welcoming each of our new team members.

今度は「market」という単語を検索してみると、結果は少し異なって以下のようになります。

# grep market memo
In order to better serve the needs of our mass
market customers, ABC Publishing is
integrating the groups selling to this channel
for ABC General Reference and ABC Computer
Publishing. This change will allow us to
better coordinate our selling and marketing
efforts, as well as simplify ABC's
relationships with these customers in the
areas of customer service, co-op management,
and credit and collection. Two national
account managers, Ricky Ponting and Greeme
Smith, have joined the sales team as a result
of these changes.

上記では、2 つの一致結果、「market」と「marketing」が検出されていることに注意してください。このファイルに「marketable」や「marketed」という単語が含まれていたとすると、ユーティリティーはこれらの単語が含まれる行も表示していたはずです。

grep ではワイルドカードおよびメタ文字を使用できますが、使用する場合は、shell がコマンドと解釈しないように引用符で囲むことを強くお勧めします。

数字が含まれるすべての行を検索するには、以下のようにします。

# grep  "[0-9]" memo
1. RICKY PONTING
2. GREEME SMITH
3. STEPHEN FLEMING
4. BORIS BAKER
5. SACHIN TENDULKAR
6. BRIAN LARA
7. SHANE WARNE

「the」が含まれるすべての行を検索するには、以下のようにします。

# grep the memo
In order to better serve the needs of our mass
market customers, ABC Publishing is
integrating the groups selling to this channel
for ABC General Reference and ABC Computer
Publishing. This change will allow us to
better coordinate our selling and marketing
efforts, as well as simplify ABC's
relationships with these customers in the
areas of customer service, co-op management,
and credit and collection. Two national
account managers, Ricky Ponting and Greeme
Smith, have joined the sales team as a result
of these changes.

To achieve this goal, we have also organized
the new mass sales group into three distinct
teams reporting to our current sales
directors, Stephen Flemming and Boris Baker. I
have outlined below the national account
managers and their respective accounts in each
of the teams. We have also hired two new
national account managers and a new sales
administrator to complete our account
coverage. They include:

お気付きのように、出力には「the」の完全一致だけでなく、「these」という単語も含まれています。

grep ユーティリティーは他のほとんどすべての UNIX/Linux ユーティリティーと同様に、大文字小文字を認識します。つまり、「the」の代わりに「The」を検索すると、まったく異なる結果となります。

# grep The memo
To achieve this goal, we have also organized
the new mass sales group into three distinct
teams reporting to our current sales
directors, Stephen Flemming and Boris Baker. I
have outlined below the national account
managers and their respective accounts in each
of the teams. We have also hired two new
national account managers and a new sales
administrator to complete our account
coverage. They include:

大文字小文字を区別しないで特定の単語や語句を検索するには、2 つの方法があります。1 つ目の方法は、以下に示すように大括弧を使って「The」と「the」の両方を検索することです。

# grep "[T, t]he" memo
In order to better serve the needs of our mass
market customers, ABC Publishing is
integrating the groups selling to this channel
for ABC General Reference and ABC Computer
Publishing. This change will allow us to
better coordinate our selling and marketing
efforts, as well as simplify ABC's
relationships with these customers in the
areas of customer service, co-op management,
and credit and collection. Two national
account managers, Ricky Ponting and Greeme
Smith, have joined the sales team as a result
of these changes.

To achieve this goal, we have also organized
the new mass sales group into three distinct
teams reporting to our current sales
directors, Stephen Flemming and Boris Baker. I
have outlined below the national account
managers and their respective accounts in each
of the teams. We have also hired two new
national account managers and a new sales
administrator to complete our account
coverage. They include:

2 つ目の方法では、-i オプションを使用します。このオプションは、grep に大文字小文字を区別しないように指示します。

# grep -i the memo
In order to better serve the needs of our mass
market customers, ABC Publishing is
integrating the groups selling to this channel
for ABC General Reference and ABC Computer
Publishing. This change will allow us to
better coordinate our selling and marketing
efforts, as well as simplify ABC's
relationships with these customers in the
areas of customer service, co-op management,
and credit and collection. Two national
account managers, Ricky Ponting and Greeme
Smith, have joined the sales team as a result
of these changes.

To achieve this goal, we have also organized
the new mass sales group into three distinct
teams reporting to our current sales
directors, Stephen Flemming and Boris Baker. I
have outlined below the national account
managers and their respective accounts in each
of the teams. We have also hired two new
national account managers and a new sales
administrator to complete our account
coverage. They include:

-i オプションの他にも、grep の出力を左右するコマンドライン・オプションがいくつかあります。最も関連のあるオプションには、以下があります。

  • -c -- 標準出力を抑止し、代わりに入力ファイルごとに一致した行数をプリントします。
  • -l -- 標準出力を抑止し、代わりに一致結果が検出された各入力ファイルの名前をプリントします。
  • -n -- 出力の各行の先頭に、その入力ファイル内での行番号を付けます。
  • -v -- 一致の意味を逆にします。つまり、検索基準と一致しない行を選択します。

fgrep

fgrep は、ファイルでストリングを検索し、該当するストリングが含まれるすべての行をプリントします。式と一致するパターンを検索する grep とは異なり、fgrep はストリングを検索します。fgrep ユーティリティーは、以下の拡張機能が追加された grep として考えることができます。

  • 一度に複数のオブジェクトを検索できます。
  • fgrep ユーティリティーの処理速度は常に grep に勝ります。
  • fgrep は、パターンによる正規表現の検索には使用できません。

例えば、前述の memo ファイルから大文字の名前を抽出するとします。grep の場合、「STEPHEN」および「BRIAN」を検索するには、以下に示すように 2 つの別個のコマンドを実行しなければなりません。

# grep STEPHEN memo
3. STEPHEN FLEMING

# grep BRIAN memo
6. BRIAN LARA

fgrep では、1 つのコマンドだけで同じタスクを実行できます。

# fgrep "STEPHEN
> BRIAN" memo
3. STEPHEN FLEMING
6. BRIAN LARA

上記のコマンドから分かるように、エントリーの間にはキャリッジ・リターンが必要です。キャリッジ・リターンがないと、各行で「STEPHEN BRIAN」が検索されることになります。リターンを入れることによって、「STEPHEN」との一致と「BRIAN」との一致が検索されます。

また、対象のテキストは引用符で囲む必要があります。これによって、テキストとファイル名が区別されます。

コマンドラインで検索項目を指定する代わりに、検索項目をファイルに書き込んで、そのファイルのコンテンツを使って他のファイルを検索することも可能です。それには、-f オプションを使用して、頻繁に検索する項目が含まれるマスター・ファイルを指定します。

例えば、「search_items」という名前のファイルに、検索対象の 2 つの項目が含まれているとします。

# cat search_items
STEPHEN
BRIAN

以下のコマンドによって、memo ファイルで「STEPHEN」と「BRIAN」が検索されます。

# fgrep -f search_items memo
3. STEPHEN FLEMING
6. BRIAN LARA

egrep

egrep は grep を一層強力にしたバージョンで、一度に複数のオブジェクトを検索できます。検索対象のオブジェクトは、(fgrep と同様に) キャリッジ・リターンまたはパイプ記号 (|) で区分します。

# egrep "STEPHEN
> BRIAN" memo
3. STEPHEN FLEMING
6. BRIAN LARA

# egrep "STEPHEN | BRIAN" memo
3. STEPHEN FLEMING
6. BRIAN LARA

上記の 2 つのコマンドはいずれも同じ検索を実行します。

複数のオブジェクトを検索する機能に加え、egrep には繰り返しおよびグループを検索する機能もあります。

  • ? は、疑問符の前に置かれた文字のゼロ回または 1 回の繰り返しを検索します。
  • + は、プラス記号の前に置かれた文字の1 回以上の繰り返しを検索します。
  • ( ) はグループを意味します。

例えば、Brian の苗字が「Lara」と「Laras」のどちらであるか思い出せないとします。

# egrep "LARAS?" memo
6. BRIAN LARA

上記の検索は、「LALA」と「LALAS」の両方と一致します。一方、以下の検索は少々異なります。

# egrep "STEPHEN+" memo
3. STEPHEN FLEMING

上記のコマンドでは、「STEPHEN」、「STEPHENN」、「STEPHENNN」などと一致します。

単語とその派生語を検索する場合は、括弧内に派生語を見分ける文字を含めます。

# egrep -i "electron(ic)?s" memo
Sachin Tendulkar, who joins us from XYZ Consumer
Electronics as a national account manager covering
traditional mass merchants.

上記のコマンドによって、「electrons」と「electronics」という両方の一致結果が検出されます。

要約すると、以下のようになります。

  • + が続く正規表現は、その正規表現の 1 回以上のオカレンスを照合します。
  • ? が続く正規表現は、その正規表現のゼロ回または 1 回のオカレンスを照合します。
  • | またはキャリッジ・リターンで区分された正規表現は、いずれかの正規表現と一致するストリングを検出します。
  • 正規表現は、括弧 ( ) で囲んでグループ化できます。
  • 使用可能なコマンドライン・パラメーターには、-c、-f、-i、-l、-n、および -v があります。

grep ユーティリティー: 実環境の例

grep 関連のユーティリティーは、行に含まれる一致を検索するために、テキスト形式のすべてのシステム・ファイルで使用できます。例えば、/etc/passwd ファイルでユーザー名「root」のエントリーを検索するには、以下のコマンドを使用します。

# grep root /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin

上記のコマンドはファイル全体で一致を検索するため、grep は「root」と「operator」の両方のエントリーを検出します。ユーザー名が「root」のエントリーだけを検索するには、コマンドを以下のように変更します。

# grep "^root" /etc/passwd
root:x:0:0:root:/root:/bin/bash

cut

cut ユーティリティーでは、列を区分してファイル内のデータ・フィールドを構成することができます。デフォルトの区切り文字はタブで、目的のフィールドを指定するには -f オプションを使用します。

例えば、「sample」というテキスト・ファイルに、以下のような 3 つの列があるとします。

one    two    three
four   five   six
seven  eight  nine
ten    eleven twelve

ここで、以下のコマンドを実行します。

# cut -f2 sample

結果は以下のようになります。

two
five
eight
eleven

コマンドを以下のように変更してみます。

# cut -f1, 3 sample

上記のコマンドでは、正反対の結果が戻されます。

one    three
four   six
seven  nine
ten    twelve

このコマンドでは、いくつかのコマンドライン・オプションを使用できます。-f の他、以下の 2 つのオプションを使いこなせるようにならなければなりません。

  • -c -- フィールドの代わりに文字を指定できます。
  • -d -- タブ以外の区切り文字を指定できます。

cut: 2 つの実環境の例

ls -l コマンドは、ディレクトリーに含まれるすべてのファイルのアクセス許可、リンク数、所有者、グループ、サイズ、日付、およびファイル名をそれぞれ空白で区切って表示します。ほとんどのフィールドは興味の対象外で、ファイル所有者だけを表示したい場合は、以下のコマンドを使用します。

# ls -l | cut -d" " -f5
root
562
root
root
root
root
root
root

上記のコマンドは、ファイル所有者 (5 番目のフィールド) だけを表示し、その他すべてのフィールドは無視します。

ファイル所有者の先頭文字が始まる正確な位置が分かるのであれば、-c オプションを使用して、ファイル所有者の先頭文字を表示することができます。例えば 16 番目の文字が開始位置だとすると、以下のコマンドによって、所有者名の先頭文字である 16 番目の文字が戻されます。

# ls -l | cut -c16
r

r
r
r
r
r
r

さらに、ほとんどのユーザーの名前は 8 文字以下であるとすると、以下のコマンドを使用できます。

# ls -l | cut -c16-24

エントリーは名前フィールドに戻されます。

ここで、ファイル名は 55 番目の文字から始まることが分かっている一方、一部のファイル名は他のものよりかなり長いため、その後に続く文字数は判断できないという場合を考えてみましょう。1 つのソリューションとして、以下に示すように 55 番目の文字を開始位置とし、最後の文字は指定しない (つまり、行の残りのすべてを取得します) という方法を取れます。

# ls -l | cut -c55-
a.out
cscope-15.5
cscope-15.5.tar
cscope.out
memo
search_items
test.c
test.s

別のシナリオを考えてみましょう。システムのすべてのユーザーのリストを取得するため、前述の例で使用した /etc/passwd ファイルから最初のフィールドだけを抽出します。

# cut -d":" -f1 /etc/passwd
root
bin
daemon
adm
lp
sync
shutdown
halt
mail
news
uucp
operator

1 番目と 6 番目のフィールドを抽出すると、ユーザー名とそれぞれのホーム・ディレクトリーを収集できます。

# cut -d":" -f1,6 /etc/passwd
root:/root
bin:/bin
daemon:/sbin
adm:/var/adm
lp:/var/spool/lpd
sync:/sbin
shutdown:/sbin
halt:/sbin
mail:/var/spool/mail
news:/etc/news
uucp:/var/spool/uucp
operator:/root

paste

paste は、複数のファイルのフィールドを結合するユーティリティーです。あるソースから 1 つの行を取得し、これを別のソースの別の行に結合します。

例えば、以下のコンテンツの「fileone」ファイルがあるとします。

IBM
Global
Services

一方、「filetwo」ファイルのコンテンツは以下のとおりです。

United States
United Kingdom
India

以下のコマンドは、この 2 つのファイルのコンテンツを結合します。

# paste fileone filetwo
IBM       United States
Global    United Kingdom
Services  India

fileone に filetwo より多くの行数が含まれる場合は、タブの後を空白のエントリーにして引き続きペーストが行われます。

デフォルトの区切り文字はタブ文字ですが、-d オプションを使って他の区切り文字に変更することができます。

# paste -d", " fileone filetwo
IBM, United States
Global, United Kingdom
Services, India

-s オプションを使用して、fileone の全コンテンツを 1 行に出力し、キャリッジ・リターンの後に filetwo のコンテンツを続けることもできます。

# paste -s fileone filetwo
IBM           Global            Services
United States United Kingdom    India

join

joinpaste を大幅に拡張したバージョンです。join は、結合対象のファイルに共通のフィールドがある場合にのみ機能します。

前述の paste コマンドで使用した 2 つのファイルを join で結合しようとすると、結果は以下のようになります。

# join fileone filetwo

何も表示されません。join ユーティリティーは、該当するファイルに共通のフィールドを検出する必要があり、デフォルトでは、共通フィールドは先頭フィールドであると期待します。

どのように機能するかを説明するため、新しいコンテンツを追加してみましょう。fileone の新しいエントリーは以下のとおりです。

aaaa    Jurassic Park
bbbb    AI
cccc    The Ring
dddd    The Mummy
eeee    Titanic

filetwo の新しいエントリーは以下のとおりです。

aaaa    Neil    1111
bbbb    Steven  2222
cccc    Naomi   3333
dddd    Brendan 4444
eeee    Kate    5555

それでは、もう一度コマンドを実行します。

# join fileone filetwo
aaaa    Jurassic Park    Neil    1111
bbbb    AI               Steven  2222
cccc    The Ring         Naomi   3333
dddd    The Mummy        Brendan 4444
eeee    Titanic          Kate    5555

最初のフィールドが共通であることが識別されたため、対応するエントリーが結合されています。paste では各ファイルの行を任意に取得して出力を作成する一方、join では完全一致を条件として、一致する行のみを結合します。例えば、filetwo に以下の 1 行を追加します。

aaaa    Neil    1111
bbbb    Steven  2222
ffff    Elisha  6666
cccc    Naomi   3333
dddd    Brendan 4444
eeee    Kate    5555

コマンドの出力結果は以下のようになります。

# join fileone filetwo
aaaa    Jurassic Park   Neil     1111
bbbb    AI              Steven   2222

ファイルが一致しなくなると、以降の操作は継続不可能になります。最初のファイルのそれぞれの行が 2 番目のファイルの対応する行とだけ照合され、デフォルト・フィールドでの一致が検索されます。一致が検出されると、出力に組み込まれます。検出されなかった場合は組み込まれません。

デフォルトでは、join は先頭フィールドでのみ一致を検索してすべての列を出力しますが、この動作は変更することが可能です。-1 オプションを使用して fileone で一致させるフィールドを指定し、-2 オプションを使用して filetwo で一致させるフィールドを指定できます。

fileone の 2 番目のフィールドを filetwo の 3 番目のフィールドと一致させるには、以下の構文を使用します。

# join -1 2 -2 3 fileone filetwo

-o オプションは、{file.field} 形式の出力を指定します。対応する行の fileone の 2 番目のフィールドと filetwo の 3 番目のフィールドをプリントする構文は、以下のようになります。

# join -o 1.2 -o 2.3 fileone filetwo

join: 実環境の例

現実の世界で join を使用する最も顕著な事例は、/etc/passwd ファイルからユーザー名とそれぞれのホーム・ディレクトリーを抽出し、/etc/group ファイルからグループ名を抽出することです。グループは、/etc/passwd ファイルの 4 番目のフィールドに数値形式で表示されます。/etc/group ファイルでも同様に数値形式で 3 番目のフィールドに表示されます。

# join -1 4 -2 3 -o 1.1 -o 2.1 -o 1.6 -t":" /etc/passwd /etc/group
root:root:/root
bin:bin:/bin
daemon:daemon:/sbin
adm:adm:/var/adm
lp:lp:/var/spool/lpd
nobody:nobody:/
vcsa:vcsa:/dev
rpm:rpm:/var/lib/rpm
nscd:nscd:/
ident:ident:/home/ident
netdump:netdump:/var/crash
sshd:sshd:/var/empty/sshd
rpc:rpc:/

awk

awk は Linux で最も強力なユーティリティーの 1 つです。実際はこれ自体がプログラミング言語であり、単にテキストからスニペットを抽出するだけでなく、複合ロジック・ステートメントでも使用できます。詳細は省きますが、構文を簡単に説明してから実環境の例を紹介します。

以下の構文を見るとわかるように、awk コマンドは、パターン、そして 1 つ以上のステートメントからなる操作で構成されます。

awk '/pattern/ {action}' file

以下の特徴があります。

  • awk は指定されたファイル (複数可) のすべてのレコードでパターンの一致をテストします。一致が検出されると、指定された操作が実行されます。
  • awk はパイプラインのフィルターとして機能したり、ファイルが指定されていない場合はキーボードからの入力 (標準入力) を使用することができます。

便利な操作の 1 つとして、データのプリントがあります。レコード内のフィールドを参照する方法には、以下があります。

  • $0 -- レコード全体
  • $1 -- レコード内の最初のフィールド
  • $2 -- レコード内の 2 番目のフィールド

1 つのレコード内にある複数のフィールドを抽出するには、それぞれのフィールドをコンマで区切ります。

例えば、/etc/passwd ファイルから 6 番目のフィールドを抽出するコマンドは、以下のようになります。

# awk -F: '{print $6}' /etc/passwd
/root
/bin
/sbin
/var/adm
/var/spool/lpd
/sbin
/sbin
/sbin
/var/spool/mail
/etc/news
/var/spool/uucp

-F は、事前定義変数 FS で定義された入力フィールドの分離文字で、上記の例では空白となっています。

/etc/passwd ファイルから 1 番目と 6 番目のフィールドを抽出するコマンドは、以下のようになります。

# awk -F: '{print $1,$6}' /etc/passwd
root /root
bin /bin
daemon /sbin
adm /var/adm
lp /var/spool/lpd
sync /sbin
shutdown /sbin
halt /sbin
mail /var/spool/mail
news /etc/news
uucp /var/spool/uucp
operator /root

フィールド間のコロン区切り文字の代わりにダッシュを使ってファイルをプリントするには、以下のコマンドを使用します。

# awk -F: '{OFS="-"}{print $1,$6}' /etc/passwd
root-/root
bin-/bin
daemon-/sbin
adm-/var/adm
lp-/var/spool/lpd
sync-/sbin
shutdown-/sbin
halt-/sbin
mail-/var/spool/mail
news-/etc/news
uucp-/var/spool/uucp
operator-/root

フィールドをダッシュで区切ってファイルをプリントし、1 番目と 6 番目のフィールドを逆順にプリントするには、以下のコマンドを使用します。

# awk -F: '{OFS="-"}{print $6,$1}' /etc/passwd
/root-root
/bin-bin
/sbin-daemon
/var/adm-adm
/var/spool/lpd-lp
/sbin-sync
/sbin-shutdown
/sbin-halt
/var/spool/mail-mail
/etc/news-news
/var/spool/uucp-uucp
/root-operator

head

head ユーティリティーは、各ファイルの最初の部分 (デフォルトでは 10 行) をプリントします。ファイルが指定されていない場合、またはファイル名に - が指定された場合は、標準入力から読み取ります。

例えば、memo ファイルの最初の 2 行を抽出するコマンドは、以下のようになります。

# head -2 memo
In order to better serve the needs of our mass
market customers, ABC Publishing is
integrating the groups selling to this channel
for ABC General Reference and ABC Computer
Publishing. This change will allow us to
better coordinate our selling and marketing
efforts, as well as simplify ABC's
relationships with these customers in the
areas of customer service, co-op management,
and credit and collection. Two national
account managers, Ricky Ponting and Greeme
Smith, have joined the sales team as a result
of these changes.

c- オプションを使用して、表示するバイト数を指定することもできます。例えば、memo ファイルの最初の 2 バイトを読み取るコマンドは、以下のようになります。

# head -c 2 memoIn

tail

tail ユーティリティーは、各ファイルの最後の部分 (デフォルトでは 10 行) をプリントします。ファイルが指定されていない場合、またはファイル名に - が指定された場合は、標準入力から読み取ります。

例えば、前述の memo ファイルの最後の 2 行を抽出するコマンドは、以下のようになります。

# tail -2 memo

Please join me in welcoming each of our new team members.

-c オプションを使用して、表示するバイト数を指定することもできます。例えば、memo ファイルの最後の 5 バイトを読み取るコマンドは、以下のようになります。

# tail -c 5 memoers.

まとめ

さまざまなユーティリティーを使用して、標準 Linux ファイルからデータを抽出する方法を説明しました。データをいったん抽出してしまえば、そのデータを操作して、表示やプリント、あるいは別のファイルやデータベースに転送することができます。この一握りのツールの使用方法を知ることで、日常的なタスクに費やされる時間が短縮され、より一層手際のよい管理者になることができます。


ダウンロード可能なリソース


関連トピック


コメント

コメントを登録するにはサインインあるいは登録してください。

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=Linux
ArticleID=231467
ArticleTitle=Linux テキスト・ユーティティーでデータ抽出を簡易化する
publish-date=08092006