一。回顧#
回顧 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 行 頻率前十的 ip#
統計 120000 行 頻率前十的 ip
[root@sanchuang-linux ~]# cat ips.txt |sort |uniq -c|sort -nr |head
#注1:第一個sort 把相同的ip段放在一起
#注2:uniq -c統計次數
#注:第二個sort -nr 對前面的次數+ip 進行逆序
#注:head 默認取前十個
注 :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 伺服器訪問前十的用戶#
統計 web 伺服器訪問前十的用戶(注:通過 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:指定分隔符,默認分隔符為 tab 鍵
-----------------------------------
提取範圍
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, # 注:默認分隔符為tab鍵,所有要壓縮
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中排名前三的ip
2顯示/boot目錄下面所有的文件大小(包括子目錄中的文件),並且由小到大排序
3統計/etc/passwd中每種shell使用的次數(降序排序)
4統計一下/etc/passwd中sbin這個單詞出現了多少次
5只顯示ens33的ip地址
============================================================================================
示例1:1統計access.log中排名前三的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: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:3統計/etc/passwd中每種shell使用的次數(降序排序)
[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: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: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結尾的行
[] 表示一個字符集
[a-z] 從a - z 中取一個
[^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
十二. [] 表示一個字符集(正則表達式)#
[] 表示一個字符集(正則表達式)
[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 中取一個
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 # 注:不以a-zA-Z開頭的行
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次
+ 代表匹配前一個項一次到多次
. 占位符 除\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項 . 出現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前面這個組在\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 注:\.轉義 第二個. 表示任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]))
#括號括起來表示一個組
分析
0-255
0-9 個位數
[1-9][0-9] 十位數
(1[0-9][0-9])|(2[0-4][0-9])|(25[0-5]) 百位數