Linuxで効果的なファイル操作を行うためにテキストをフィルタリングするための12の便利なコマンド


この記事では、Linuxでフィルターとして機能するいくつかのコマンドラインツールを確認します。フィルタは、標準入力を読み取り、それに対して操作を実行し、結果を標準出力に書き込むプログラムです。

このため、出力を再構築して有用なレポートを生成したり、ファイル内のテキストを変更したり、その他の多くのシステム管理タスクを実行したりするなど、強力な方法で情報を処理するために使用できます。

そうは言っても、以下はLinuxで役立つファイルまたはテキストフィルターの一部です。

1.Awkコマンド

Awkは注目に値するパターンスキャンおよび処理言語であり、Linuxで有用なフィルターを構築するために使用できます。 Awkシリーズのパート1からパート13を読むことで、使用を開始できます。

さらに、詳細と使用オプションについては、awkのmanページもお読みください。

$ man awk

2.Sedコマンド

sedは、テキストをフィルタリングおよび変換するための強力なストリームエディタです。 sedに関する2つの役立つ記事をすでに書いていますので、ここで確認できます。

  1. How to use GNU ‘sed’ Command to Create, Edit, and Manipulate files in Linux
  2. 15 Useful ‘sed’ Command Tips and Tricks for Daily Linux System Administration Tasks

sedのマニュアルページに、制御オプションと手順が追加されました。

$ man sed

3. Grep、Egrep、Fgrep、Rgrepコマンド

これらのフィルターは、指定されたパターンに一致する行を出力します。ファイルまたは標準入力から行を読み取り、一致するすべての行をデフォルトで標準出力に出力します。

注:メインプログラムはgrepです。バリエーションは、以下の特定のgrepオプションを使用する場合と同じです(下位互換性のために引き続き使用されます)。

$ egrep = grep -E
$ fgrep = grep -F
$ rgrep = grep -r  

以下は、いくつかの基本的なgrepコマンドです。

[email protected] ~ $ grep "aaronkilik" /etc/passwd
aaronkilik:x:1001:1001::/home/aaronkilik:

[email protected] ~ $ cat /etc/passwd | grep "aronkilik"
aaronkilik:x:1001:1001::/home/aaronkilik:

LinuxでのGrep、Egrep、Fgrepの違いについて詳しく読むことができます。

4.ヘッドコマンド

headはファイルの最初の部分を表示するために使用され、デフォルトでは最初の10行を出力します。 -n numフラグを使用して、表示する行数を指定できます。

[email protected] ~ $ head /var/log/auth.log  
Jan  2 10:45:01 TecMint CRON[3383]: pam_unix(cron:session): session opened for user root by (uid=0)
Jan  2 10:45:01 TecMint CRON[3383]: pam_unix(cron:session): session closed for user root
Jan  2 10:51:34 TecMint sudo:  tecmint : TTY=unknown ; PWD=/home/tecmint ; USER=root ; COMMAND=/usr/lib/linuxmint/mintUpdate/checkAPT.py
Jan  2 10:51:34 TecMint sudo: pam_unix(sudo:session): session opened for user root by (uid=0)
Jan  2 10:51:39 TecMint sudo: pam_unix(sudo:session): session closed for user root
Jan  2 10:55:01 TecMint CRON[4099]: pam_unix(cron:session): session opened for user root by (uid=0)
Jan  2 10:55:01 TecMint CRON[4099]: pam_unix(cron:session): session closed for user root
Jan  2 11:05:01 TecMint CRON[4138]: pam_unix(cron:session): session opened for user root by (uid=0)
Jan  2 11:05:01 TecMint CRON[4138]: pam_unix(cron:session): session closed for user root
Jan  2 11:09:01 TecMint CRON[4146]: pam_unix(cron:session): session opened for user root by (uid=0)

[email protected] ~ $ head  -n 5 /var/log/auth.log  
Jan  2 10:45:01 TecMint CRON[3383]: pam_unix(cron:session): session opened for user root by (uid=0)
Jan  2 10:45:01 TecMint CRON[3383]: pam_unix(cron:session): session closed for user root
Jan  2 10:51:34 TecMint sudo:  tecmint : TTY=unknown ; PWD=/home/tecmint ; USER=root ; COMMAND=/usr/lib/linuxmint/mintUpdate/checkAPT.py
Jan  2 10:51:34 TecMint sudo: pam_unix(sudo:session): session opened for user root by (uid=0)
Jan  2 10:51:39 TecMint sudo: pam_unix(sudo:session): session closed for user root

Linuxで効果的に使用するために、headコマンドをtailおよびcatコマンドとともに使用する方法を学びます。

5.テールコマンド

tailは、ファイルの最後の部分(デフォルトでは10行)を出力します。 -n numスイッチを使用して、表示する行数を指定します。

以下のコマンドは、指定されたファイルの最後の5行を出力します。

[email protected] ~ $ tail -n 5 /var/log/auth.log
Jan  6 13:01:27 TecMint sshd[1269]: Server listening on 0.0.0.0 port 22.
Jan  6 13:01:27 TecMint sshd[1269]: Server listening on :: port 22.
Jan  6 13:01:27 TecMint sshd[1269]: Received SIGHUP; restarting.
Jan  6 13:01:27 TecMint sshd[1269]: Server listening on 0.0.0.0 port 22.
Jan  6 13:01:27 TecMint sshd[1269]: Server listening on :: port 22.

さらに、tailには、ファイル(特にログファイル)の変更をリアルタイムで監視するための特別なオプション -f があります。

次のコマンドを使用すると、指定したファイルの変更を監視できます。

[email protected] ~ $ tail -f /var/log/auth.log
Jan  6 12:58:01 TecMint sshd[1269]: Server listening on :: port 22.
Jan  6 12:58:11 TecMint sshd[1269]: Received SIGHUP; restarting.
Jan  6 12:58:12 TecMint sshd[1269]: Server listening on 0.0.0.0 port 22.
Jan  6 12:58:12 TecMint sshd[1269]: Server listening on :: port 22.
Jan  6 13:01:27 TecMint sshd[1269]: Received SIGHUP; restarting.
Jan  6 13:01:27 TecMint sshd[1269]: Server listening on 0.0.0.0 port 22.
Jan  6 13:01:27 TecMint sshd[1269]: Server listening on :: port 22.
Jan  6 13:01:27 TecMint sshd[1269]: Received SIGHUP; restarting.
Jan  6 13:01:27 TecMint sshd[1269]: Server listening on 0.0.0.0 port 22.
Jan  6 13:01:27 TecMint sshd[1269]: Server listening on :: port 22.

使用オプションと手順の完全なリストについては、テールマンページをお読みください。

$ man tail

6.ソートコマンド

sortは、テキストファイルの行をソートするため、または標準入力からソートするために使用されます。

以下は、domains.listという名前のファイルの内容です。

[email protected] ~ $ cat domains.list
tecmint.com
tecmint.com
news.tecmint.com
news.tecmint.com
linuxsay.com
linuxsay.com
windowsmint.com
windowsmint.com

単純なsortコマンドを実行して、次のようにファイルの内容を並べ替えることができます。

[email protected] ~ $ sort domains.list
linuxsay.com
linuxsay.com
news.tecmint.com
news.tecmint.com
tecmint.com
tecmint.com
windowsmint.com
windowsmint.com

sortコマンドはさまざまな方法で使用できます。次のように、sortコマンドに関する役立つ記事をいくつか読んでください。

  1. 14 Useful Examples of Linux ‘sort’ Command – Part 1
  2. 7 Interesting Linux ‘sort’ Command Examples – Part 2
  3. How to Find and Sort Files Based on Modification Date and Time
  4. How to Sort Output of ‘ls’ Command By Last Modified Date and Time

7.uniqコマンド

uniqコマンドは、繰り返される行を報告または省略するために使用され、標準入力からの行をフィルタリングして、結果を標準出力に書き込みます。

入力ストリームでsortを実行した後、以下の例のように、uniqを使用して繰り返し行を削除できます。

行の出現回数を示すには、 -c オプションを使用し、 -i オプションを含めて比較する際に、大文字と小文字の違いを無視します。

[email protected] ~ $ cat domains.list
tecmint.com
tecmint.com
news.tecmint.com
news.tecmint.com
linuxsay.com
linuxsay.com
windowsmint.com

[email protected] ~ $ sort domains.list | uniq -c 
2 linuxsay.com
2 news.tecmint.com
2 tecmint.com
1 windowsmint.com 

使用法の詳細とフラグについては、uniqのmanページをお読みください。

$ man uniq

8.fmtコマンド

fmtシンプルな最適なテキストフォーマッタ。指定されたファイルの段落を再フォーマットし、結果を標準出力に出力します。

以下は、domain-list.txtファイルから抽出されたコンテンツです。

1.tecmint.com 2.news.tecmint.com 3.linuxsay.com 4.windowsmint.com

上記のコンテンツを標準リストに再フォーマットするには、 -w スイッチを使用して次のコマンドを実行し、最大線幅を定義します。

[email protected] ~ $ cat domain-list.txt 
1.tecmint.com 2.news.tecmint.com 3.linuxsay.com 4.windowsmint.com

[email protected] ~ $ fmt -w 1 domain-list.txt
1.tecmint.com 
2.news.tecmint.com 
3.linuxsay.com 
4.windowsmint.com

9.prコマンド

prコマンドは、テキストファイルまたは標準入力を印刷用に変換します。たとえば、Debianシステムでは、インストールされているすべてのパッケージを次のように一覧表示できます。

$ dpkg -l

印刷可能なページと列にリストを整理するには、次のコマンドを発行します。

[email protected] ~ $ dpkg -l | pr --columns 3 -l 20  

2017-01-06 13:19                                                  Page 1


Desired=Unknown/Install ii  adduser		ii  apg
| Status=Not/Inst/Conf- ii  adwaita-icon-theme	ii  app-install-data
|/ Err?=(none)/Reinst-r ii  adwaita-icon-theme- ii  apparmor
||/ Name		ii  alsa-base		ii  apt
+++-=================== ii  alsa-utils		ii  apt-clone
ii  accountsservice	ii  anacron		ii  apt-transport-https
ii  acl			ii  apache2		ii  apt-utils
ii  acpi-support	ii  apache2-bin		ii  apt-xapian-index
ii  acpid		ii  apache2-data	ii  aptdaemon
ii  add-apt-key		ii  apache2-utils	ii  aptdaemon-data


2017-01-06 13:19                                                  Page 2


ii  aptitude		ii  avahi-daemon	ii  bind9-host
ii  aptitude-common	ii  avahi-utils		ii  binfmt-support
ii  apturl		ii  aview		ii  binutils
ii  apturl-common	ii  banshee		ii  bison
ii  archdetect-deb	ii  baobab		ii  blt
ii  aspell		ii  base-files		ii  blueberry
ii  aspell-en		ii  base-passwd		ii  bluetooth
ii  at-spi2-core	ii  bash		ii  bluez
ii  attr		ii  bash-completion	ii  bluez-cups
ii  avahi-autoipd	ii  bc			ii  bluez-obexd

.....

ここで使用されるフラグは次のとおりです。

  1. --column defines number of columns created in the output.
  2. -l specifies page length (default is 66 lines).

10.trコマンド

このツールは、標準入力から文字を変換または削除し、結果を標準出力に書き込みます。

trを使用するための構文は次のとおりです。

$ tr options set1 set2

以下の例を見てください。最初のコマンドで、 set1([:upper:])は入力文字の大文字と小文字(すべて大文字)を表します。

は、新しい行に出力を出力することを意味します。

[email protected] ~ $ echo "WWW.TECMINT.COM" | tr [:upper:] [:lower:]
www.tecmint.com

[email protected] ~ $ echo "news.tecmint.com" | tr [:lower:] [:upper:]
NEWS.TECMINT.COM

11.その他のコマンド

moreコマンドは、基本的に証明書を表示するために作成された便利なファイル閲覧フィルターです。ファイルの内容がページのような形式で表示され、ユーザーは[Enter]を押して詳細情報を表示できます。

これを使用して、次のような大きなファイルを表示できます。

[email protected] ~ $ dmesg | more
[    0.000000] Initializing cgroup subsys cpuset
[    0.000000] Initializing cgroup subsys cpu
[    0.000000] Initializing cgroup subsys cpuacct
[    0.000000] Linux version 4.4.0-21-generic ([email protected]) (gcc version 5.3.1 20160413 (Ubuntu 5.3.1-14ubuntu2) ) #37-Ubuntu SMP Mon Apr 18 18:33:37 UTC 2016 (Ubuntu 4.4.0-21.37-generic
 4.4.6)
[    0.000000] Command line: BOOT_IMAGE=/boot/vmlinuz-4.4.0-21-generic root=UUID=bb29dda3-bdaa-4b39-86cf-4a6dc9634a1b ro quiet splash vt.handoff=7
[    0.000000] KERNEL supported cpus:
[    0.000000]   Intel GenuineIntel
[    0.000000]   AMD AuthenticAMD
[    0.000000]   Centaur CentaurHauls
[    0.000000] x86/fpu: xstate_offset[2]:  576, xstate_sizes[2]:  256
[    0.000000] x86/fpu: Supporting XSAVE feature 0x01: 'x87 floating point registers'
[    0.000000] x86/fpu: Supporting XSAVE feature 0x02: 'SSE registers'
[    0.000000] x86/fpu: Supporting XSAVE feature 0x04: 'AVX registers'
[    0.000000] x86/fpu: Enabled xstate features 0x7, context size is 832 bytes, using 'standard' format.
[    0.000000] x86/fpu: Using 'eager' FPU context switches.
[    0.000000] e820: BIOS-provided physical RAM map:
[    0.000000] BIOS-e820: [mem 0x0000000000000000-0x000000000009d3ff] usable
[    0.000000] BIOS-e820: [mem 0x000000000009d400-0x000000000009ffff] reserved
[    0.000000] BIOS-e820: [mem 0x00000000000e0000-0x00000000000fffff] reserved
[    0.000000] BIOS-e820: [mem 0x0000000000100000-0x00000000a56affff] usable
[    0.000000] BIOS-e820: [mem 0x00000000a56b0000-0x00000000a5eaffff] reserved
[    0.000000] BIOS-e820: [mem 0x00000000a5eb0000-0x00000000aaabefff] usable
--More--

12.少ないコマンド

lessは、上記のmoreコマンドの反対ですが、追加機能を提供し、大きなファイルでは少し高速になります。

moreと同じように使用します。

[email protected] ~ $ dmesg | less
[    0.000000] Initializing cgroup subsys cpuset
[    0.000000] Initializing cgroup subsys cpu
[    0.000000] Initializing cgroup subsys cpuacct
[    0.000000] Linux version 4.4.0-21-generic ([email protected]) (gcc version 5.3.1 20160413 (Ubuntu 5.3.1-14ubuntu2) ) #37-Ubuntu SMP Mon Apr 18 18:33:37 UTC 2016 (Ubuntu 4.4.0-21.37-generic
 4.4.6)
[    0.000000] Command line: BOOT_IMAGE=/boot/vmlinuz-4.4.0-21-generic root=UUID=bb29dda3-bdaa-4b39-86cf-4a6dc9634a1b ro quiet splash vt.handoff=7
[    0.000000] KERNEL supported cpus:
[    0.000000]   Intel GenuineIntel
[    0.000000]   AMD AuthenticAMD
[    0.000000]   Centaur CentaurHauls
[    0.000000] x86/fpu: xstate_offset[2]:  576, xstate_sizes[2]:  256
[    0.000000] x86/fpu: Supporting XSAVE feature 0x01: 'x87 floating point registers'
[    0.000000] x86/fpu: Supporting XSAVE feature 0x02: 'SSE registers'
[    0.000000] x86/fpu: Supporting XSAVE feature 0x04: 'AVX registers'
[    0.000000] x86/fpu: Enabled xstate features 0x7, context size is 832 bytes, using 'standard' format.
[    0.000000] x86/fpu: Using 'eager' FPU context switches.
[    0.000000] e820: BIOS-provided physical RAM map:
[    0.000000] BIOS-e820: [mem 0x0000000000000000-0x000000000009d3ff] usable
[    0.000000] BIOS-e820: [mem 0x000000000009d400-0x000000000009ffff] reserved
[    0.000000] BIOS-e820: [mem 0x00000000000e0000-0x00000000000fffff] reserved
[    0.000000] BIOS-e820: [mem 0x0000000000100000-0x00000000a56affff] usable
[    0.000000] BIOS-e820: [mem 0x00000000a56b0000-0x00000000a5eaffff] reserved
[    0.000000] BIOS-e820: [mem 0x00000000a5eb0000-0x00000000aaabefff] usable
:

Linuxで効果的なファイルナビゲーションを行うために、「少ない」が「多い」コマンドよりも速い理由を学びましょう。

今のところこれですべてです。ここに記載されていない便利なコマンドラインツールがあれば、以下のコメントセクションからLinuxでテキストフィルターとして機能します。