mycpen

Mycpen

记录学习历程与受益知识
github
telegram
bilibili

12_Linux基礎-SHELLコマンド-sort-uniq-cut-grep-正規表現-ワイルドカード

一。振り返り#

振り返り 1 shell のよく使うコマンド

コマンドの戻り出力結果を取得する	
1.` `,バッククォート	 line=`ls`
2.$()			line=$(ls)
seqはpythonのrangeに似ている
主に順序付きの数字のシーケンスを生成する
-s 区切り文字を指定
-w 同じ幅で出力を指定

二. sort#

sort コマンド

  • デフォルトでは各行の最初の文字でソート
  • -n:整数でソート --> デフォルトは昇順
  • -r:降順ソート(注:降順)
  • -u:重複を削除

ソートキーを指定

  • どの列のデータでソートするかを指定
  • -k:どの列をソートキーとして指定
  • cat tt | sort -n -k4

フィールド区切り文字を指定

  • -t:フィールド区切り文字を指定(デフォルトは空白)
  • sort -t: -n -k3 /etc/passwd # 注:区切り文字を:に指定

sort はソートコマンドです

  • デフォルトでは各行の最初の文字でソートします
    • 英語は a-z の順でソートされ、最初の文字が同じ場合は次の文字を比較し、順次続きます
    • 中国語は最初の文字のピンインの最初の文字でソートされます
例1:cat sort_test.txt |sort
---------------------------------------------------------------------------------------------------------------------------------
[root@sanchuang-linux ~]# cat sort_test.txt 			# 注:テキスト内容を表示
中文 456 1xx  123
abc bcd  3yy dd
Aac XYZ  2zz
三创 xixi
[root@sanchuang-linux ~]# cat sort_test.txt |sort		# 注:全体のテキストをソート
三创 xixi
中文 456 1xx  123
Aac XYZ  2zz
abc bcd  3yy dd
--------------------------------------------------------------------------------------------
>>> ord("三")							# pythonのord()関数でユニコードを確認
19977									# 注:sortはコード順でソートしません
>>> ord("中")
20013
--------------------------------------------------------------------------------------------
[root@sanchuang-linux ~]# locale		# 注:エンコーディング形式を確認
LANG=zh_CN.UTF-8
LC_CTYPE="zh_CN.UTF-8"
LC_NUMERIC="zh_CN.UTF-8"
LC_TIME="zh_CN.UTF-8"
LC_COLLATE="zh_CN.UTF-8"
LC_MONETARY="zh_CN.UTF-8"
LC_MESSAGES="zh_CN.UTF-8"
LC_PAPER="zh_CN.UTF-8"
LC_NAME="zh_CN.UTF-8"
LC_ADDRESS="zh_CN.UTF-8"
LC_TELEPHONE="zh_CN.UTF-8"
LC_MEASUREMENT="zh_CN.UTF-8"
LC_IDENTIFICATION="zh_CN.UTF-8"
LC_ALL=
============================================================================================
例2:cat sort_test.txt |sort -k 2	どの列をソートキーとして指定
[root@sanchuang-linux ~]# cat sort_test.txt |sort -k2		# 注:第二列でソートを指定
中文 456 1xx  123
abc bcd  3yy dd
三创 xixi
Aac XYZ  2zz
[root@sanchuang-linux ~]# cat sort_test.txt |sort -k 3	  # 注:第三列でソートを指定
三创 xixi													# 注:空白が前にある
中文 456 1xx  123											# 注:1
Aac XYZ  2zz											 # 注:2
abc bcd  3yy dd											 # 注:3
============================================================================================
例3:英語はa-zの順でソートされ、最初の文字が同じ場合は次の文字を比較
[root@sanchuang-linux ~]# cat sort_test.txt 
中文 456 1xx  123
aac bcd  3yy dd
Aac XYZ  2zz
三创 xixi
Xyz  cde
Bbc  Abc
bbc xxx
ABC
abc
[root@sanchuang-linux ~]# cat sort_test.txt |sort			# 注:コード順でソートされない
三创 xixi
中文 456 1xx  123
aac bcd  3yy dd
Aac XYZ  2zz
abc
ABC
Bbc  Abc
bbc xxx
Xyz  cde

sort -n#

sort -n 数字でソート

[root@sanchuang-linux ~]# a=123						# 注:aは文字を示す
[root@sanchuang-linux ~]# b=234
[root@sanchuang-linux ~]# echo $a+$b				# 注:文字列の結合
123+234
[root@sanchuang-linux ~]# echo $(($a+$b))			# 注:2つの括弧で数字を加算する必要がある
357
--------------------------------------------------------------------------------------------
[root@sanchuang-linux ~]# cat aa.txt 
123
23
4
234
[root@sanchuang-linux ~]# cat aa.txt |sort			# 注:デフォルトでは最初の文字列でソート
123
23
234
4
[root@sanchuang-linux ~]# cat aa.txt |sort -n		# 注:sort -n 数値の大きさでソート
4													# 注:デフォルトは昇順
23													# 注:-n 数字のソート比較
123
234
--------------------------------------------------------------------------------------------
[root@sanchuang-linux ~]# cat aa.txt |sort -n -r	# 注:数字、逆順でソート、効果は同じ
[root@sanchuang-linux ~]# cat aa.txt |sort -nr		# 注:数字、逆順でソート、効果は同じ
234
123
23
4

-t 列数の区切り文字を指定#

列数の区切り文字を指定 # head -n7 /etc/passwd |sort -k6 -t :

デフォルトの区切り文字は空白文字

-t を使用して列数の区切り文字を指定

[root@sanchuang-linux ~]# head -n7 /etc/passwd |sort		# 注:最初の7行を取得してソート
adm:x:3:4:adm:/var/adm:/sbin/nologin
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
root:x:0:0:root:/root:/bin/bash
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
sync:x:5:0:sync:/sbin:/bin/sync
[root@sanchuang-linux ~]# head -n7 /etc/passwd |sort -k2	# 注:sort -k2で第2列をソートキーとして指定
adm:x:3:4:adm:/var/adm:/sbin/nologin
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
root:x:0:0:root:/root:/bin/bash
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
sync:x:5:0:sync:/sbin:/bin/sync
[root@sanchuang-linux ~]# head -n7 /etc/passwd |sort -k6 -t :			# *注:-t : 区切り文字を : に指定
bin:x:1:1:bin:/bin:/sbin/nologin
root:x:0:0:root:/root:/bin/bash
sync:x:5:0:sync:/sbin:/bin/sync
daemon:x:2:2:daemon:/sbin:/sbin/nologin
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
[root@sanchuang-linux ~]# head -n7 /etc/passwd |sort -k6 -t : -r		# 注:-r 逆順

三。練習:メモリ使用率が最も高い 5 つのプロセスを見つける#

メモリ使用率が最も高い 5 つのプロセスを見つける

ps aux|sort -n -k4 -r|head -5		注:推奨
注:メモリ使用率 %MEM
[root@sanchuang-linux ~]# ps aux|tail -n +2|sort -nr -k4 |head -5
root         960  0.0  2.0 221572 38096 ?        S    08:31   0:00 /usr/libexec/sssd/sssd_nss --uid 0 --gid 0 --logger=files
root         930  0.0  1.7 425416 31480 ?        Ssl  08:31   0:01 /usr/libexec/platform-python -Es /usr/sbin/tuned -l -P
polkitd      890  0.0  1.2 1625936 23856 ?       Ssl  08:31   0:00 /usr/lib/polkit-1/polkitd --no-debug
root         891  0.0  0.9 391216 18088 ?        Ssl  08:31   0:00 /usr/sbin/NetworkManager --no-daemon
root         954  0.0  0.8 219700 15416 ?        S    08:31   0:00 /usr/libexec/sssd/sssd_be --domain implicit_files --uid 0 --gid 0 --logger=files
--------------------------------------------------------------------------------------------
#ps aux|tail -n +2|sort -nr -k4 |head -5
注:tail -n +2は第2行から末尾まで表示(追加しても良い)
注:sort -nr -k4   -nは数字でソートし、-rは逆順、-k4は第4列をソートキーとして指定
注:head -5は最初の5行を取得

四. uniq#

uniq コマンドの使用(重複削除)

uniq --> unique 唯一の
隣接する行の重複を削除
先にソートしてから重複を削除
-c 重複している回数をカウント
-u 1 回だけ出現する行を表示
-d 重複している行を表示

============================================================================================
例1:隣接する行の重複を削除
[root@sanchuang-linux ~]# cat uniq_test.txt
123 abc
abc 123
45
46
45
45
47
47
48
47
[root@sanchuang-linux ~]# cat uniq_test.txt |uniq		# 注:隣接する行の重複を削除
123 abc
abc 123
45
46
45
47
48
47
[root@sanchuang-linux ~]# cat uniq_test.txt |sort -n |uniq	# 注:先にソートしてから重複を削除
abc 123														# 注:一般的に、先にソートしてから重複を削除
45
46
47
48
123 abc
--------------------------------------------------------------------------------------------
例1.1 # cat uniq_test.txt |sort -nu
[root@sanchuang-linux ~]# cat uniq_test.txt |sort -n -u		# 注:sort -uでも重複を削除できる
[root@sanchuang-linux ~]# cat uniq_test.txt |sort -nu		# 注:効果は同じ
abc 123
45
46
47
48
123 abc
============================================================================================
例2:-c 重複している回数をカウント
[root@sanchuang-linux ~]# cat uniq_test.txt |sort -n |uniq -c    # 注: -c 重複している回数をカウント
      1 abc 123
      3 45
      1 46
      3 47
      1 48
      1 123 abc
============================================================================================
例3:-u 1回だけ出現する行を表示
[root@sanchuang-linux ~]# cat uniq_test.txt |sort -n |uniq -u	# 注:-u 1回だけ出現する行を表示
abc 123
46
48
123 abc
============================================================================================
例4:-d 重複している行を表示
[root@sanchuang-linux ~]# cat uniq_test.txt |sort -n |uniq -d	# 注:-d 重複している行を表示
45
47

五。練習:120000 行の頻度上位 10 の IP をカウント#

120000 行の頻度上位 10 の IP をカウント

[root@sanchuang-linux ~]# cat ips.txt |sort |uniq -c|sort -nr |head
#注1:最初のsortは同じIPセグメントをまとめる
#注2:uniq -cで回数をカウント
#注:2番目のsort -nrで前の回数+IPを逆順で行う
#注:headはデフォルトで最初の10個を取得
 :sort -cはIPアドレスのアクセスをカウントするために使用されます
[root@localhost ~]# yum install nginx
[root@localhost ~]# nginx
[root@localhost ~]# lsof -i:80			# 注:nginxが起動しました
COMMAND   PID  USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
nginx   12765  root    9u  IPv4  60060      0t0  TCP *:http (LISTEN)
nginx   12765  root   10u  IPv6  60061      0t0  TCP *:http (LISTEN)
nginx   12766 nginx    9u  IPv4  60060      0t0  TCP *:http (LISTEN)
nginx   12766 nginx   10u  IPv6  60061      0t0  TCP *:http (LISTEN)
nginx   12767 nginx    9u  IPv4  60060      0t0  TCP *:http (LISTEN)
nginx   12767 nginx   10u  IPv6  60061      0t0  TCP *:http (LISTEN)
[root@sanchuang-linux ~]# iptables -F			# 注:ファイアウォールを無効にする

[root@sanchuang-linux ~]# cd /var/log			# 注:/var/logにログを保存
[root@sanchuang-linux log]# cd nginx
[root@sanchuang-linux nginx]# pwd
/var/log/nginx
[root@sanchuang-linux nginx]# ls
access.log  error.log							# 注:ログファイル

六。練習:Web サーバーのアクセス上位 10 のユーザーをカウント#

Web サーバーのアクセス上位 10 のユーザーをカウント(注:IP で判断)

#注:nginxで最もアクセスの多い3つのIPを確認する(筆記試験でよく見られる)
#cat access.log |awk '{print $1}'|sort|uniq -c|sort -nr|head -3
[root@sanchuang-linux nginx]# head access.log 
192.168.0.42 - - [29/Oct/2020:12:01:01 +0800] "GET / HTTP/1.1" 200 4057 "-" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3823.400 QQBrowser/10.7.4307.400" "-"
………………						# 注:awkコマンドでテキストの最初の列データIPアドレスを抽出
[root@sanchuang-linux nginx]# cat access.log |awk '{print $1}'
192.168.0.42				# 注:デフォルトで空白を区切り文字として、最初の列$1を表示
192.168.0.42
192.168.0.42
192.168.0.42
192.168.0.42
192.168.0.193
192.168.0.193
192.168.0.193
192.168.0.193				# 注:awkコマンドでテキストの最初の列データIPアドレスを抽出
[root@sanchuang-linux nginx]# cat access.log |awk '{print $1}'|sort|uniq -c|sort -nr|head -3
      5 192.168.0.42		# 注:上位3のアクセス量をカウント
      4 192.168.0.193

七. cut#

cut コマンド

  • テキストファイルまたはテキストストリームからテキスト列を抽出
  • cut -オプション 抽出範囲 テキストファイル

-----------------------------------

一般的なオプション

  • -c:指定した範囲から文字を抽出
  • -f:指定した範囲からフィールドを抽出
  • -d:区切り文字を指定、デフォルトの区切り文字はタブキー

-----------------------------------

抽出範囲

n:第n項

n-:第n項から行末まで

-m:行首から第m項まで

n,m:第n項と第m項

n-m:第n項から第m項


--------------------------------------------------------------------------------------------
[root@sanchuang-linux ~]# w					# 注:w 現在のユーザーのログイン状況
 14:45:33 up  4:12,  5 users,  load average: 0.00, 0.00, 0.03
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
root     tty1     -                三22   15:49   0.08s  0.08s -bash
root     pts/0    192.168.0.42     14:29    3.00s  0.02s  0.01s w
root     pts/1    192.168.0.42     14:29   15:35   0.00s  0.00s -bash
root     pts/3    192.168.0.42     09:48    4:56m  0.03s  0.03s -bash
root     pts/4    192.168.0.42     09:50    2:37m  0.52s  0.52s -bash
[root@sanchuang-linux ~]# who				# 注:wで詳細を確認
root     tty1         2020-10-28 22:15
root     pts/0        2020-10-29 14:29 (192.168.0.42)
root     pts/1        2020-10-29 14:29 (192.168.0.42)
root     pts/3        2020-10-29 09:48 (192.168.0.42)
root     pts/4        2020-10-29 09:50 (192.168.0.42)
方法1
--------------------------------------------------------------------------------------------
[root@sanchuang-linux ~]# w |tr -s " "|cut -d" " -f 1,2,4
 14:50:31 4:17,									# 注:デフォルトの区切り文字はタブキー、すべてを圧縮 
USER TTY LOGIN@									# 注:再度区切り文字を空白に指定
root tty1 三22								   # 注:tr -s " "を追加
root pts/0 14:29
root pts/1 14:29
root pts/3 09:48
root pts/4 09:50
方法2
--------------------------------------------------------------------------------------------
[root@sanchuang-linux ~]# w |awk '{print $1,$2,$4}'		# 注:awk デフォルトの区切り文字は空白文字
14:51:28 up 5										    # 注:第1、2、4列を表示
USER TTY LOGIN@
root tty1 三22
root pts/0 14:29
root pts/1 14:29
root pts/3 09:48
root pts/4 09:50

コロンを区切り文字としてユーザー名、ユーザー ID、ユーザーグループを抽出#

コロンを区切り文字としてユーザー名、ユーザー ID、ユーザーグループを抽出

書き方1
[root@sanchuang-linux ~]# cat /etc/passwd|cut -d":" -f 1,3,5	
書き方2(推奨)
[root@sanchuang-linux ~]# cut -d ":" -f 1,3,5 /etc/passwd	# 注:1,3,5列を抽出
#注:テキスト操作コマンドで、テキストを直接操作でき、catを使用する必要はない

値の範囲#

値の範囲

[root@sanchuang-linux ~]# cut -d ":" -f 1,3,5 /etc/passwd	# 注:1,3,5列を抽出
[root@sanchuang-linux ~]# cut -d ":" -f 1-5 /etc/passwd		# 注:1-5列を抽出
[root@sanchuang-linux ~]# cut -d ":" -f 3- /etc/passwd		# 注:3列から--列末までを抽出
[root@sanchuang-linux ~]# cut -d ":" -f -3 /etc/passwd		# 注:最初の3列を抽出
============================================================================================
-c:指定した範囲から文字を抽出

[root@sanchuang-linux ~]# echo abcdefg |cut -c 2		# 注:第2文字を抽出
b
[root@sanchuang-linux ~]# echo abcdefg |cut -c 2-5		# 注:2--5文字を抽出
bcde
[root@sanchuang-linux ~]# echo abcdefg |cut -c 5-		# 注:第5から末尾の文字を抽出
efg

八。練習#

練習

1 access.logで上位3のIPをカウント
2 /bootディレクトリ内のすべてのファイルサイズを表示(サブディレクトリ内のファイルを含む)、小さい順にソート
3 /etc/passwdで各種シェルの使用回数をカウント(降順ソート)
4 /etc/passwdでsbinという単語が出現する回数をカウント
5 ens33のIPアドレスのみを表示
============================================================================================
例1:access.logで上位3のIPをカウント
--------------------------------------------------------------------------------------------
[root@sanchuang-linux ~]# cut -d "-" -f 1 access.log |sort|uniq -c|sort -nr|head -n3
      7 192.168.0.42 
      6 192.168.0.193 
      5 192.168.0.38 
--------------------------------------------------------------------------------------------
[root@sanchuang-linux ~]# cut -d " " -f1 access.log |sort|uniq -c
      6 192.168.0.193
      5 192.168.0.21
      5 192.168.0.32
      5 192.168.0.37
      5 192.168.0.38
      7 192.168.0.42
[root@sanchuang-linux ~]# cut -d " " -f1 access.log |sort|uniq -c|sort -nr
      7 192.168.0.42
      6 192.168.0.193
      5 192.168.0.38
      5 192.168.0.37
      5 192.168.0.32
      5 192.168.0.21
[root@sanchuang-linux ~]# cut -d " " -f1 access.log |sort|uniq -c|sort -nr|head -3
      7 192.168.0.42
      6 192.168.0.193
      5 192.168.0.38
============================================================================================
例2:/bootディレクトリ内のすべてのファイルサイズを表示(サブディレクトリ内のファイルを含む)、小さい順にソート
方法1
--------------------------------------------------------------------------------------------
[root@sanchuang-linux ~]# du -ak /boot |sort -n  		# 注:kをバイトとして
4	/boot/.bashrc
4	/boot/efi/EFI/centos
4	/boot/grub2/device.map
4	/boot/grub2/grubenv
4	/boot/grub2/i386-pc/adler32.mod
4	/boot/grub2/i386-pc/all_video.mod
4	/boot/grub2/i386-pc/aout.mod

方法2
--------------------------------------------------------------------------------------------
[root@sanchuang-linux ~]# ll -R|grep root|tr -s " "|cut -d " " -f 5,9|sort -n
0 1214.txt
0 12244.txt
0 1224.txt
0 12456.txt
0 20
0 20
0 2020-09-24-18_25_03.txt

方法3
--------------------------------------------------------------------------------------------
[root@sanchuang-linux ~]# ll -R|grep root|awk '{print $5,$9}'|sort -n
0 1214.txt
0 12244.txt
0 1224.txt
0 12456.txt
0 20
0 20
0 2020-09-24-18_25_03.txt
0 abcd.txt
============================================================================================
例3:/etc/passwdで各種シェルの使用回数をカウント(降順ソート)
[root@sanchuang-linux ~]# cut -d : -f7 /etc/passwd |sort|uniq -c|sort -nr
     31 /bin/bash
     19 /sbin/nologin
      1 /sbin/shutdown
      1 /sbin/halt
      1 /bin/sync
============================================================================================
例4:/etc/passwdでsbinという単語が出現する回数をカウント
方法1
--------------------------------------------------------------------------------------------
[root@sanchuang-linux ~]# grep -o sbin /etc/passwd
sbin
sbin
………………
sbin
sbin
[root@sanchuang-linux ~]# grep -o sbin /etc/passwd|wc -l
25

方法2
--------------------------------------------------------------------------------------------
[root@sanchuang-linux ~]# cat /etc/passwd|tr ":" "\n"|grep sbin|wc -l
25						# 注::を改行文字に変換し、同じ行を異なる行に移動
============================================================================================
例5:ens33のIPアドレスのみを表示
#ip a |grep ens33|grep inet|tr -s " "|cut -d " " -f3|cut -d"/" -f1
--------------------------------------------------------------------------------------------
[root@sanchuang-linux ~]# ip a |grep ens33
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    inet 192.168.0.34/24 brd 192.168.0.255 scope global dynamic noprefixroute ens33
[root@sanchuang-linux ~]# ip a |grep ens33|grep inet|tr -s " "|cut -d " " -f3
192.168.0.34/24
[root@sanchuang-linux ~]# ip a |grep ens33|grep inet|tr -s " "|cut -d " " -f3|cut -d"/" -f1
192.168.0.34

九. awk で区切り文字を指定 -F#

awk で区切り文字を指定 -F

[root@sanchuang-linux ~]# awk -F":" '{print $1}' /etc/passwd
root
bin
daemon
adm
lp
sync
………………………… 

十. grep#

grep コマンド

テキストの三剣客 ==> awk grep sed
https://www.cnblogs.com/end/archive/2012/02/21/2360965.html
grep フィルタリング 一般的な正規表現解析プログラム
grep、egrep、fgrep
マッチングによってフィルタリングする

用途:ファイル内で指定された文字列を含む行を検索して表示する フォーマット:grep [オプション]... パターン 対象ファイル

#注:パターン pattern --》テンプレート

正規表現を受け入れることができます

-i:検索時に大文字と小文字を無視する

-v:逆転検索、パターンに一致しない行を出力

-n:パターンに一致する行番号を表示

-r:すべてのファイルを再帰的に検索

-o:一致する内容のみを表示

-E:より多くのメタ文字をサポート(拡張正規表現をサポート)

-A:一致した行とその後の数行を表示

-B:一致した行とその前の数行を出力

パターン

^…. :何で始まるか、行全体が何で始まるか

…..$ :何で終わるか、行全体が何で終わるか

注:grep はテキスト操作コマンドで、テキストを直接操作できます

=====================================================================
例1:-v:逆転検索、パターンに一致しない行を出力
---------------------------------------------------------------------
[root@sanchuang-linux ~]# grep -v “#” /etc/yum.repos.d/centos.repo   
# 注:#を含む行を出力しない
============================================================================================

例2:-i 検索時に大文字と小文字を無視する
---------------------------------------------------------------------
[root@sanchuang-linux ~]# cd /etc/ssh/
[root@sanchuang-linux ssh]# pwd
/etc/ssh
[root@sanchuang-linux ssh]# grep -i "port" /etc/ssh/sshd_config 		# 注:検索時に大文字と小文字を無視する
# If you want to change the port on a SELinux system, you have to tell
# semanage port -a -t ssh_port_t -p tcp #PORTNUMBER
#Port 22
# WARNING: 'UsePAM no' is not supported in Fedora and may cause several
#GatewayPorts no
============================================================================================

例3:大文字と小文字を無視し、一致した行番号を表示
--------------------------------------------------------------------------------------------
[root@sanchuang-linux ssh]# grep -i -n "port" /etc/ssh/sshd_config 		# 注:パターンに一致する行番号を表示
13:# If you want to change the port on a SELinux system, you have to tell
15:# semanage port -a -t ssh_port_t -p tcp #PORTNUMBER
17:#Port 22
102:# WARNING: 'UsePAM no' is not supported in Fedora and may cause several
108:#GatewayPorts no
============================================================================================

例4:-r すべてのファイルを再帰的に検索
注:サブディレクトリおよびサブサブディレクトリ内を検索
--------------------------------------------------------------------------------------------
[root@sanchuang-linux ssh]# grep "xxxxx" * -r  				# 注:現在のディレクトリのすべてのディレクトリおよびサブディレクトリ内の再帰的な検索
[root@sanchuang-linux ssh]# grep "GET" /var/log/nginx -r  	# 注:nginxディレクトリ内で再帰的に検索
/var/log/nginx/error.log:2020/10/29 12:01:02 [error] 12767#0: *2 open() "/usr/share/nginx/html/favicon.ico" failed (2: No such file or directory), client: 192.168.0.42, server: _, request: "GET /favicon.ico HTTP/1.1", host: "192.168.0.34", referrer: "http://192.168.0.34/"
/var/log/nginx/error.log:2020/10/29 12:01:58 [error] 12767#0: *2 open() "/usr/share/nginx/html/favicon.ico" failed (2: No such file or directory), client: 192.168.0.42, server: _, request: "GET /favicon.ico HTTP/1.1", host: "192.168.0.34"
--------------------------------------------------------------------------------------------
#/var/log/nginx内のすべてのファイルを再帰的に検索(その下のサブディレクトリ内のファイルを含む)
[root@mysql-binary nginx]# grep "GET" /var/log/nginx -r

十一。正規表現#

正規表現

^aa aaで始まる行を示す
aa$ aaで終わる行を示す

[]      1つの文字セットを示す
[a-z]   a - zの中から1つを取る
[^a-z]  a-zの文字を取らない
grep ^[^a-zA-Z0-9_] grep_test.txt  アルファベット、数字、アンダースコアで始まらない行を表示
例1:#で始まる行を出力しない
--------------------------------------------------------------------------------------------
[root@sanchuang-linux yum.repos.d]# grep -v ^# centos.repo
[root@sanchuang-linux yum.repos.d]# grep -v ^# centos.repo|grep -v ^$   # 注:空白行を出力しない
注:空白行を出力しない       grep -v ^$
   #で始まる行を出力しない  grep -v ^#
============================================================================================

例2:grep_test.txtの中で、#で始まらない行と空白行でない行をフィルタリング
--------------------------------------------------------------------------------------------
[root@sanchuang-linux chenpeng]# cat grep_test.txt
#aaa
aaa#bbb

456
#
789
[root@sanchuang-linux chenpeng]# grep -v ^# grep_test.txt  # 注:#で始まらない行をフィルタリング
aaa#bbb

456
789

#方法1
[root@sanchuang-linux chenpeng]# grep -v ^# grep_test.txt |grep -v ^$	# 注:空白行をフィルタリング
aaa#bbb                                      # 注:空白文字の場合はフィルタリングされない
456
789

#方法2
grep_test.txtの中で、#で始まらない行と空白行でない行をフィルタリング
[root@sanchuang-linux chenpeng]# grep -v -E "^#|^$" grep_test.txt 
aaa#bbb                         # 注:-E 正規表現 、| または 、 -vを表示しない
456                             # 注:-E:より多くのメタ文字をサポート(拡張正規表現をサポート)
789

十二. [] 1 つの文字セットを示す(正規表現)#

[] 1 つの文字セットを示す(正規表現)

[root@localhost chenpeng]# cat grep_test.txt 
abc
adc
Abdc
ac
a1c
axy
axc
123
777
例1:abc adcをフィルタリング
--------------------------------------------------------------------------------------------
[root@localhost chenpeng]# grep a[bd]c grep_test.txt        # 注:文字セット[bd]の中から1つを取る
abc
adc
[root@sanchuang-linux chenpeng]# grep a[a-z]c grep_test.txt # 注:a-zの中から1つの文字を取る
abc                                        # 注:ac    はフィルタリングされない、必ず1つの文字が必要
adc                                        # 注:[a-z] は a - zの中から1つを取る
axc
[root@sanchuang-linux chenpeng]# grep a[0-9]c grep_test.txt     # 注:0-9の中から1つの文字を取る
a1c
--------------------------------------------------------------------------------------------

例2:[^a-z] a-zの文字を取らない
--------------------------------------------------------------------------------------------
[root@sanchuang-linux chenpeng]# grep a[^a-z]c grep_test.txt    # 注:^は反転、acの間にa-zの文字を取らない
a1c

例3:アルファベットで始まらない行を取る
--------------------------------------------------------------------------------------------
[root@sanchuang-linux chenpeng]# grep ^[^a-zA-Z] grep_test.txt  # 注:アルファベットで始まらない行を示す
11c
123                                   # 注:間に空白がある場合、空白も含む
777
注:grep ^[a-zA-Z] grep_test.txt  アルファベットで始まる行を示す
=============================================================================================
例4:アルファベット、数字、アンダースコアで始まらない行を表示
書き方1
[root@sanchuang-linux chenpeng]# grep ^[^a-zA-Z0-9_] grep_test.txt
書き方2
[root@sanchuang-linux chenpeng]# grep -v ^[a-zA-Z0-9_] grep_test.txt
#注:アルファベット、数字、アンダースコアで始まらない行を表示

十三。ワイルドカード(正規表現)#

ワイルドカード(正規表現)

*     前の項目を任意の回数マッチ
?    前の項目を0回または1回マッチ
+     前の項目を1回から多回マッチ
.     プレースホルダー 任意の文字(\nを除く)
{n,m} 前の項目をnからm回マッチ
egrepはgrep -Eと同じ
fgrepは正規表現をサポートしない、通常のテキストフィルタリング
例1:* ? + .
--------------------------------------------------------------------------------------------
#注:マッチするのは前の文字です
[root@localhost ~]# cat grep_test.txt 
alc
axxc
ac
[root@localhost ~]# grep -E a.?c grep_test.txt    # 注:-Eはより多くの正規表現拡張をサポート
alc                                               # 注:.  プレースホルダー(注=必ず1つの文字が必要)
ac                                                # 注:.? はaとcの間に.が0回または1回出現可能
[root@localhost ~]# grep -E a.*c grep_test.txt    # 注:.* はaとcの間に任意の数の.(任意の文字)が出現可能
alc               # 注:egrepはgrep -Eと同じ
axxc
ac
[root@localhost ~]# grep -E a.c grep_test.txt     # 注:.  はaとcの間に1つの文字があることを示す
alc
[root@localhost ~]# grep -E a.+c grep_test.txt    # 注:前の文字が.が1回から多回出現することを示す
alc
axxc

例2:{ }
--------------------------------------------------------------------------------------------
#注:マッチするのは前の文字です
[root@localhost ~]# egrep "a.{1}c" grep_test.txt    # 注:.が1回出現することを指定
alc
[root@localhost ~]# egrep "a.{1,2}c" grep_test.txt  # 注:.が1回から2回出現することを指定
alc
axxc

例3:{ }
--------------------------------------------------------------------------------------------
[root@localhost ~]# cat grep_test.txt 
alc
axxc
ac
ayy1c
addddddc
[root@localhost ~]# egrep "a.{1,5}c" grep_test.txt           # 注:前の項目が.が1回から5回出現することを示す
alc
axxc
ayy1c

egrepはgrep -Eと同じ
fgrepは正規表現をサポートしない、通常のテキストフィルタリング

十四。練習:grep 正規表現#

grep 正規表現

1、/lianxi ディレクトリに移動し、/etc/passwd を現在のディレクトリにコピーし、その後 passwd を操作する

2、現在の passwd ファイルで ftp または mail で始まる行を検索し、画面に出力する

grep -E "^ftp|^mail" passwd
egrep "^ftp|^mail" passwd

3、現在の passwd ファイルで r、m、f で始まらない行を検索する

grep -v -E "^r|^m|^f" passwd
grep ^[^rmp] passwd

4、現在の passwd で bash で終わる行を検索する

grep bash$ passwd

5、/etc/login.defs ファイルの有効行を検索する(空行と #で始まるコメント行を表示しない)

grep -v -E "^#|^$" /etc/login.defs

6、/var/log/messages 文書の中で 15 文字の単語を検索する

grep -E "[^a-zA-Z][a-zA-Z{15}][^a-zA-Z]" /var/log/message  # 注:左右は単語でなく、中間が15文字
grep -E "\b[a-zA-Z{15}]\b" /var/log/message                # 注:\bは単語の境界を自動的にマッチ

7、/etc/passwd ファイルでユーザー名に liu を含み、bash を使用しているユーザーを検索する

grep liu /etc/passwd|grep bash$|cut -d":" -f1

8、/etc/ssh/sshd_config の有効行を検索する

grep -v -E "^#|^$" /etc/ssh/sshd_config

9、/etc/ssh/sshd_config ファイルで連続して 2 つの文字を含む行を検索する

grep -E "(.)\1" /etc/ssh/sshd_config 
grep -E "(.)\1"  # 注:.は改行を除く任意の文字  \1は前のグループがここで再度出現することを示す(一致)

10、特殊文字を含む行を検索する

grep -E "[^0-Z]" grep_test.txt

11、数字を含まない行を検索する

grep -v "[0-9]" abc.txt

12、/var/log/secure の中の IP アドレスを検索する

cut -d " " -f11 /var/log/secure|grep -E "\.."|sort|uniq    注:\.はエスケープ  2番目の.は任意の1文字
--------------------------------------------------------------------------------------------
grep -E "((([0-9])|([1-9][0-9])|(1[0-9][0-9])|(2[0-4][0-9])|(25[0-5]))\.){3}(([0-9])|([1-9][0-9])|(1[0-9][0-9])|(2[0-4][0-9])|(25[0-5]))" ip_test.txt
============================================================================================
IPアドレスのマッチング:
   Ipv4  0-255  4つ    192.168.1.0
注:IPアドレスをマッチングする
[root@sanchuang-linux ~]# grep -E "((([0-9])|([1-9][0-9])|(1[0-9][0-9])|(2[0-4][0-9])|(25[0-5]))\.){3}(([0-9])|([1-9][0-9])|(1[0-9][0-9])|(2[0-4][0-9])|(25[0-5]))" ip_test.txt
192.168.0.1
192.168.1.255
172.0.0.1

((([0-9])|([1-9][0-9])|(1[0-9][0-9])|(2[0-4][0-9])|(25[0-5]))\.){3}(([0-9])|([1-9][0-9])|(1[0-9][0-9])|(2[0-4][0-9])|(25[0-5]))
#括弧で囲まれた部分は1つのグループを示す

分析
0-255
0-9                                     1桁の数
[1-9][0-9]                              10桁の数
(1[0-9][0-9])|(2[0-4][0-9])|(25[0-5])   100桁の数

読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。