grep
grep 是linux 中最常用的“文本处理工具之一” 与sed awk 合称为linux中的三剑客!
grep 就像你在windows中打开txt文件,使用快捷键“Ctrl+F” 在文本中查找某个字符串一样,可以把grep 理解为字符查找工具
grep 的全程为Global search Regular Expression and Print out the line 为全局搜索的意思
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
|
-i:在搜索的时候忽略大小写 [root@localhost ~] # cat /etc/passwd|grep -i "SSH" sshd:x:74:74:Privilege-separated SSH: /var/empty/sshd : /sbin/nologin -n: 显示结果所在行号 [root@localhost ~] # cat /etc/passwd|grep -ni "SSH" 17:sshd:x:74:74:Privilege-separated SSH: /var/empty/sshd : /sbin/nologin -c:统计匹配到的行数 [root@localhost ~] # cat /etc/passwd|grep "root" root:x:0:0:root: /root : /bin/bash operator:x:11:0:operator: /root : /sbin/nologin [root@localhost ~] # cat /etc/passwd|grep -c "root" 2 -w:匹配单个单词,如果字符串中包含这个单词,则不匹配 [root@localhost ~] # cat /etc/passwd.bak|grep -w "root" root:x:0:0:root: /root : /bin/bash rootroo:x:0:0:root: /root : /bin/bash #不会显示rootroo的 -e:实现多个选项的匹配。逻辑或or的关系 == egrep == grep -E [root@localhost ~] # cat /etc/passwd.bak|egrep -w "root|sshd" root:x:0:0:root: /root : /bin/bash rootroo:x:0:0:root: /root : /bin/bash operator:x:11:0:operator: /root : /sbin/nologin sshd:x:74:74:Privilege-separated SSH: /var/empty/sshd : /sbin/nologin -q: 静默模式,不输出任何信息 判断: echo $? [root@localhost ~] # cat /etc/passwd.bak|grep -q "root" - v :输出不带关键字的行(反向查询,反向匹配) [root@localhost ~] # cat /etc/passwd.bak|grep -v "root" bin:x:1:1:bin: /bin : /sbin/nologin daemon:x:2:2:daemon: /sbin : /sbin/nologin adm:x:3:4:adm: /var/adm : /sbin/nologin lp:x:4:7:lp: /var/spool/lpd : /sbin/nologin sync :x:5:0: sync : /sbin : /bin/sync shutdown :x:6:0: shutdown : /sbin : /sbin/shutdown halt:x:7:0:halt: /sbin : /sbin/halt mail:x:8:12:mail: /var/spool/mail : /sbin/nologin games:x:12:100:games: /usr/games : /sbin/nologin ftp :x:14:50:FTP User: /var/ftp : /sbin/nologin nobody:x:99:99:Nobody:/: /sbin/nologin systemd-network:x:192:192:systemd Network Management:/: /sbin/nologin dbus:x:81:81:System message bus:/: /sbin/nologin polkitd:x:999:998:User for polkitd:/: /sbin/nologin sshd:x:74:74:Privilege-separated SSH: /var/empty/sshd : /sbin/nologin postfix:x:89:89:: /var/spool/postfix : /sbin/nologin chrony:x:998:996:: /var/lib/chrony : /sbin/nologin |
sed
流编辑器,主要用来过滤和替换文本内容
工作原理:sed命令将当前处理的行读入模式空间进行处理,处理完把结果输出,并清空模式。然后再将下一行读入模式空间进行处理输出,以此类推,直至最后一行。
用法:
sed [选项] ‘命令’ file_name
选项:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
参数说明: -e<script>或--expression=<script> 以选项中指定的script来处理输入的文本文件。 -f<script文件>或-- file =<script文件> 以选项中指定的script文件来处理输入的文本文件。 -h或--help 显示帮助。 -n或--quiet或--silent 仅显示script处理后的结果。 -V或--version 显示版本信息。 动作说明: a :新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)~ c :取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行! d :删除,因为是删除啊,所以 d 后面通常不接任何咚咚; i :插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行); p :打印,亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运行~ s :取代,可以直接进行取代的工作哩!通常这个 s 的动作可以搭配正规表示法!例如 1,20s /old/new/g 就是啦! |
awk
awk 是一个优良的文本处理工具。(其名称得自于它的创始人阿尔佛雷德·艾侯、彼得·温伯格和布莱恩·柯林汉姓氏的首个字母)
语法:awk 'pattern {action}' file_name
其中 pattern 表示 AWK 在数据中查找的内容,而 action 是在找到匹配内容时所执行的一系列命令
1
|
[root@localhost ~] # awk '{print $0}' /etc/passwd<br>root:x:0:0:root:/root:/bin/bash<br>bin:x:1:1:bin:/bin:/sbin/nologin<br>daemon:x:2:2:daemon:/sbin:/sbin/nologin<br><br> |
print 是打印命令 $0 是代表当前行
awk 会根据空格和制表符,将每一行分成若干字段,一次用$1,$2,$3代表第一个字段,第二个字段,第三个字段
-F 指定分隔符为冒号
1
2
3
4
5
6
7
8
|
[root@localhost ~] # awk -F ':' '{print $1,$2}' /etc/passwd root bin daemon adm lp sync shutdown |
awk 常用变量
NF:表示最后一个字段
1
2
3
4
5
6
|
[root@localhost ~] # awk -F ':' '{print $NF}' /etc/passwd /bin/bash /sbin/nologin /sbin/nologin /sbin/nologin /sbin/nologin |
$(NF-1):表示倒数第二个字段
1
2
3
4
5
6
|
[root@localhost ~] # awk -F ':' '{print $(NF-1)}' /etc/passwd /root /bin /sbin /var/adm /var/spool/lpd |
NR:表示当前处理的是第几行
输出第二行
1
2
|
[root@localhost ~] # awk -F ":" 'NR==2 {print}' /etc/passwd bin:x:1:1:bin: /bin : /sbin/nologin |
输出第三行以后的行
1
2
3
4
5
|
[root@localhost ~] # awk -F ':' 'NR>3 {print}' /etc/passwd adm:x:3:4:adm: /var/adm : /sbin/nologin lp:x:4:7:lp: /var/spool/lpd : /sbin/nologin sync :x:5:0: sync : /sbin : /bin/sync shutdown :x:6:0: shutdown : /sbin : /sbin/shutdown |
awk 内置函数
toupper()用于将字符转为大写【t^ber】
1
2
3
4
5
6
|
[root@localhost ~] # awk -F ':' '{print toupper($1)}' /etc/passwd ROOT BIN DAEMON ADM LP |
tolower()用于将字符串转为小写
1
2
3
4
5
6
|
[root@localhost ~] # awk -F ':' '{print toupper($1)}' /etc/passwd >/tmp/aa.txt [root@localhost ~] # awk '{print tolower($1)}' /tmp/aa.txt root bin daemon adm |
awk 允许指定输出条件,只输出符合条件的行
打印包含root的行
1
2
3
|
[root@localhost ~] # awk '/root/ {print}' /etc/passwd root:x:0:0:root: /root : /bin/bash operator:x:11:0:operator: /root : /sbin/nologin |
输出第一个字段等于指定值的行
1
2
|
[root@localhost ~] # awk -F ':' '$1=="root" {print}' /etc/passwd root:x:0:0:root: /root : /bin/bash |
awk if else语句
假如$1==root 打印第一个字段,否则打印第二个字段
1
2
3
4
5
6
|
[root@localhost ~] # awk -F : '{if ($1=="root") print $1;else print $2}' /etc/passwd root x x x x |
awk 高级用法BEGIN END
任何在BEGIN之后列出的操作(在{}内)将在Unix awk开始扫描输入之前执行,而END之后列出的操作将在扫描完全部的输入之后执行。
因此,通常使用BEGIN来显示变量和预置(初始化)变量,使用END来输出最终结果
数字求和
1
|
seq 10| awk '{sum+=$0} END {print sum}' |
1
2
3
4
5
6
7
8
9
|
例:累计销售文件xs中的销售金额(假设销售金额在记录的第三字段): cat sx 一:50件:200.00 二:60件:300.00 三:70件:400.00 |
1
2
3
4
5
6
7
8
|
[root@localhost ~] # awk 'BEGIN {FS=":";print "统计销售金额";total=0} {print $3;total=total+$3;} END {printf "销售金额总计: %.2f
",total}' sx 统计销售金额 200.00 300.00 400.00 销售金额总计: 900.00 |