Linuxのgrepとegrepコマンドの詳細

7513 ワード

rep/egrep
構文:grep[-cinvABC]'word'filename
-c:要求に適合する行数を印刷する-i:大文字小文字を無視-n:要求に適合する行を出力するとともに行番号とともに出力する-v:要求に適合しない行を印刷する-A:後に数字を付ける(スペースの有無にかかわらず)例えば、A 2は、要求に適合する行と、次の2行Bと、次の2行Bと、次の2行Bと、次の2行B 2は、要求に適合する行と、上の2行Cと、次の2行Cと、次の2行Bとを表す.例えば、C 2は、要求に適合する行と、上下の2行を表す
「halt」を含む行と、この行の下の2行を印刷します.
[root@localhost ~]# grep -A2 'halt' /etc/passwd
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin

「halt」を含む行とその行の上の2行を印刷します.
[root@localhost ~]# grep -B2 'halt' /etc/passwd
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt

 
「halt」を含む行と、その行の上と下の2行を印刷します.
あるキーワードを持つ行をフィルタし、行番号を出力します.
[root@localhost ~]# grep -n 'root' /etc/passwd
1:root:x:0:0:root:/root:/bin/bash
11:operator:x:11:0:operator:/root:/sbin/nologin

キーワードのない行をフィルタし、行番号を出力します.
[root@localhost ~]# grep -nv 'nologin' /etc/passwd
1:root:x:0:0:root:/root:/bin/bash
6:sync:x:5:0:sync:/sbin:/bin/sync
7:shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
8:halt:x:7:0:halt:/sbin:/sbin/halt
26:test:x:511:511::/home/test:/bin/bash
27:test1:x:512:511::/home/test1:/bin/bash

数値を含むすべての行をフィルタ
[root@localhost ~]# grep '[0-9]' /etc/inittab
# upstart works, see init(5), init(8), and initctl(8).
# 0 - halt (Do NOT set initdefault to this)
# 1 - Single user mode
# 2 - Multiuser, without NFS (The same as 3, if you do not have networking)
# 3 - Full multiuser mode
# 4 - unused
# 5 - X11
# 6 - reboot (Do NOT set initdefault to this)
id:3:initdefault:

数値を含まないすべての行をフィルタ
[root@localhost ~]# grep -v '[0-9]' /etc/inittab
# inittab is only used by upstart for the default runlevel.
#
# ADDING OTHER CONFIGURATION HERE WILL HAVE NO EFFECT ON YOUR SYSTEM.
#
# System initialization is started by /etc/init/rcS.conf
#
# Individual runlevels are started by /etc/init/rc.conf
#
# Ctrl-Alt-Delete is handled by /etc/init/control-alt-delete.conf
#
# Terminal gettys are handled by /etc/init/tty.conf and /etc/init/serial.conf,
# with configuration in /etc/sysconfig/init.
#
# For information on how to write upstart event handlers, or how
#
# Default runlevel. The runlevels used are:
#

「#」で始まるすべての行を削除
[root@localhost ~]# grep -v '^#' /etc/inittab
id:3:initdefault:

すべての空の行と'#'で始まる行を除去
[root@localhost ~]# grep -v '^#' /etc/crontab |grep -v '^$'
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/

 
正規表現では「^」は行の始まりを表し、「$」は行の終わりを表すが、空白行は「^$」で表すことができ、英語のアルファベットで始まる行を印刷するにはどうすればいいのだろうか.
[root@localhost ~]# vim test.txt
[root@localhost ~]# cat test.txt
123
abc
456
abc2323
#laksdjf
Alllllllll

まずtest.txtにはいくつかの文字列が書かれていて、実験に使います.
[root@localhost ~]# grep '^[^a-zA-Z]' test.txt
123
456
#laksdjf
[root@localhost ~]# grep '[^a-zA-Z]' test.txt
123
456
abc2323
#laksdjf

数字であれば[0-9]という形で、もちろん1または5しか含まれていない[15]という形でも使えますが、15とは思えないことに注意してください.数字と大文字と小文字をフィルタする場合は、[0-9 a-zA-Z]と書きます.また、[^文字]は[]内の文字以外の文字を表す形式もあります.
任意の文字と重複文字をフィルタ
[root@localhost ~]# grep 'r..o' /etc/passwd
operator:x:11:0:operator:/root:/sbin/nologin
gopher:x:13:30:gopher:/var/gopher:/sbin/nologin
vcsa:x:69:69:virtual console memory owner:/dev:/sbin/nologin

 
. 任意の文字を表します.前例では、rとoの間に2つの任意の文字がある行をフィルタし、*は0つ以上の前の文字を表します.
[root@localhost ~]# grep 'ooo*' /etc/passwd
root:x:0:0:root:/root:/bin/bash
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin

「ooo*」はoo、ooo、oooo...あるいはもっと多くの「o」が今あなたは「.*」を考えていますか?この組み合わせは何を意味しますか?
[root@localhost ~]# grep '.*' /etc/passwd |wc -l
27
[root@localhost ~]# wc -l /etc/passwd
27 /etc/passwd

 
‘.*' ゼロまたは複数の任意の文字を表し、空白行も含まれます.
フィルタする文字の出現回数を指定します
[root@localhost ~]# grep 'o\{2\}' /etc/passwd
root:x:0:0:root:/root:/bin/bash
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin

 
脱意符にEを付けなくてもいいです
grep -E 'o{2}' /etc/passwd

 
ここでは{}を用い,その内部は数字であり,前の文字が繰り返される回数を表す.上記の例では、oである「oo」を2つ含む行を示します.なお、{}の左右に脱意文字''を付ける必要があります.また、{}を使用して範囲を表すこともできます.具体的なフォーマットは'{n 1,n 2}'のn 1です.
上記のgrepは、egrepというツールがよく使われています.簡単に言えば、後者は前者の拡張バージョンで、grepではできない仕事をegrepで完成することができます.もちろん、grepで完成できるegrepは完全に完成することができます.面倒であれば、egrepを理解すればいいです.grepの機能は日常の仕事に適しているからです.次にegrepがgrepに使用されないいくつかの使い方を紹介します.試験の便宜上、test.txtは次のように編集されます.
rot:x:0:0:/rot:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
operator:x:11:0:operator:/rooot:/sbin/nologin
roooot:x:0:0:/rooooot:/bin/bash
1111111111111111111111111111111
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

1つ以上の前の文字をフィルタ
[root@localhost ~]# egrep 'o+' test.txt
rot:x:0:0:/rot:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
operator:x:11:0:operator:/rooot:/sbin/nologin
roooot:x:0:0:/rooooot:/bin/bash
[root@localhost ~]# egrep 'oo+' test.txt
operator:x:11:0:operator:/root:/sbin/nologin
operator:x:11:0:operator:/rooot:/sbin/nologin
roooot:x:0:0:/rooooot:/bin/bash
[root@localhost ~]# egrep 'ooo+' test.txt
operator:x:11:0:operator:/rooot:/sbin/nologin
roooot:x:0:0:/rooooot:/bin/bash

 
0文字または1文字前の文字をフィルタ
[root@localhost ~]# egrep 'o?' test.txtrot:x:0:0:/rot:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
operator:x:11:0:operator:/rooot:/sbin/nologin
roooot:x:0:0:/rooooot:/bin/bash
1111111111111111111111111111111
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
[root@localhost ~]# egrep 'ooo?' test.txt
operator:x:11:0:operator:/root:/sbin/nologin
operator:x:11:0:operator:/rooot:/sbin/nologin
roooot:x:0:0:/rooooot:/bin/bash
[root@localhost ~]# egrep 'oooo?' test.txt
operator:x:11:0:operator:/rooot:/sbin/nologin
roooot:x:0:0:/rooooot:/bin/bash

文字列1または文字列2のフィルタ
[root@localhost ~]# egrep 'aaa|111|ooo' test.txt
operator:x:11:0:operator:/rooot:/sbin/nologin
roooot:x:0:0:/rooooot:/bin/bash
1111111111111111111111111111111
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

 
egrepにおける()の応用
[root@localhost ~]# egrep 'r(oo)|(at)o' test.txt
operator:x:11:0:operator:/root:/sbin/nologin
operator:x:11:0:operator:/rooot:/sbin/nologin
roooot:x:0:0:/rooooot:/bin/bash

 
1つの全体を()で表し、例えば(oo)+は1つの「oo」または複数の「oo」を表す.
[root@localhost ~]# egrep '(oo)+' test.txt
operator:x:11:0:operator:/root:/sbin/nologin
operator:x:11:0:operator:/rooot:/sbin/nologin
roooot:x:0:0:/rooooot:/bin/bash

 
興味のある記事:
  • linuxでgrepコマンドを使用する詳細
  • linuxでgrepマッチングテーブルと改行のコマンド
  • Linux grepを使用して複数の条件をフィルタリングし、grep常用フィルタコマンド
  • linuxシステムユーザー管理とgrep正規表現例チュートリアル
  • Linuxでgrepコマンドを使用してファイル内容を取得する方法の詳細
  • 記事の同時配信:https://www.geek-share.com/detail/2781961114.html