Linux文本三剑客及特殊符号和正则
常用特殊符号的使用
Linux系统下特殊符号起到了很大的作用,特殊符号可以完成一些特殊的功能
*常用的特殊符号,在文件名上,用来代表任意多个任意字符
? 常用的特殊符号,在文件名上,用来代表任意单个任意字符
[0-9] #在文件名上,用来代表多个字符或连续范围中的一个,若无则忽略
{a,b,cd,abcd} #在文件名上,用来代表多组不同的字符串,全匹配
- 范例
#查找以tab结尾的文件
[root@localhost ~]# ls /etc/*tab
[root@localhost ~]# ls /etc/*wd
[root@localhost ~]# ls /etc/*.conf
[root@localhost ~]# ls /etc/redhat*
[root@localhost ~]# ls /etc/*ss*
#查找以tty开头的文件,结尾以一个任意字符结尾
[root@localhost ~]# ls /dev/tty?
[root@localhost ~]# ls /etc/host?
[root@localhost ~]# ls /etc/pass??
#查找tty开头结尾以1-5连续字符结尾
[root@localhost ~]# ls /dev/tty[1-5]
[root@localhost ~]# ls /dev/tty[4-9]
[root@localhost ~]# ls /dev/tty[1,3,5,7,9,15,20,30]
#查找tty开头结尾为不连续字符结尾
[root@localhost ~]# ls /dev/tty{1,3,5,7,9,15,20,30}
[root@localhost ~]# ls /dev/tty{1..9}
[root@localhost ~]# ls /dev/tty{1..10}
[root@localhost ~]# ls /dev/tty[1-10]
正则表达式
- 正则表达式使用一串符号描述有共同属性的数据
基本正则符号 | 描述 |
---|---|
^ | 匹配行首 |
$ | 匹配行尾 |
[] | 集合,匹配集合中的任意单个字符 |
[^] | 对集合取反 |
. | 匹配任意单个字符 |
* | 匹配前一个字符出现的任意次数[*不允许单独[使用] |
匹配前一个字符 n 到 m 次 | |
匹配前一个字符 n 次 |
#匹配以什么什么开头的行
[root@localhost yunwei]# grep "^root" /etc/passwd
root:x:0:0:root:/root:/bin/bash
[root@localhost yunwei]# grep "^#" /etc/fstab
#匹配以什么什么结尾的行
[root@localhost yunwei]# grep "bash$" /etc/passwd
[root@localhost yunwei]# grep -v "^#" /etc/fstab
[root@localhost yunwei]# grep -v "^#" /etc/fstab | grep -v "^$"
#集合,匹配集合中的任意单个字符
[root@localhost yunwei]# grep "ro[abcotabcd]" /etc/passwd
#集合,对集合中的任意单个字符取反
[root@localhost yunwei]# grep "ro[^abcotabcd]" /etc/passwd
#匹配任意单个字符
[root@localhost yunwei]# grep "roo." /etc/passwd
[root@localhost yunwei]# grep ".oot" /etc/passwd
[root@localhost yunwei]# grep "w.*" /etc/passwd
#准备素材
[root@localhost yunwei]# vim 1.txt
a
b
ab
aab
acb
adb
amnb
amnbmnbmnb
aaaabaaaaaaabaaaaaaaaaaaaab
aabb the ccdd
abcthe
thexxoo
xxootheooxx
[root@localhost yunwei]# grep "a*b" 1.txt
[root@localhost yunwei]# grep "a.*b" 1.txt
[root@localhost yunwei]# grep ".*b" 1.txt
[root@localhost yunwei]# grep "a.*" 1.txt
#匹配前一个字符至少出现一次以上,\{n,m\}
[root@localhost yunwei]# grep "a\{1,\}" 1.txt
#匹配前一个字符 n 次,\{n\}
[root@localhost yunwei]# grep "o\{2\}" /etc/passwd
[root@localhost yunwei]# grep "a\{2\}" 1.txt
扩展正则符号 | 描述 |
---|---|
+ | 最少匹配一次 |
? | 最多匹配一次 |
匹配 n 到 m 次 | |
() | 组合为整体,保留(复制) |
| | 或者 |
\b | 单词边界 |
#基本正则用法
[root@localhost yunwei]# grep "a\{2,4\}b" 1.txt
#使用扩展正则时,需要使用egrep命令过滤
[root@localhost yunwei]# egrep "a{2,4}b" 1.txt
#匹配前一个字符至少出现一次以上
[root@localhost yunwei]# egrep "a+" 1.txt
#基本正则实现方式,匹配前一个字符至少出现一次以上
[root@localhost yunwei]# grep "a\{1,\}" 1.txt
#匹配前一个字符出现了0次或一次
[root@localhost yunwei]# egrep "a?b" 1.txt
#基本正则实现方式,匹配前一个字符出现了0次或一次
[root@localhost yunwei]# grep "a\{0,1\}b" 1.txt
[root@thinkmo ~]# egrep 'a{1,2}' 1.txt
#或者
[root@localhost yunwei]# egrep "ab|acb|aaab" 1.txt
#组合为整体
[root@localhost yunwei]# egrep "(ab)" 1.txt
ab
aab
aaaabaaaaaaabaaaaaaaaaaaaab
[root@localhost yunwei]# egrep "(acb)" 1.txt
acb
[root@localhost yunwei]# egrep "(aaab)" 1.txt
#单词边界
[root@localhost yunwei]# grep "the" 1.txt
aabb the ccdd
abcthe
thexxoo
xxootheooxx
[root@localhost yunwei]# egrep "\bthe\b" 1.txt
aabb the ccdd
[root@localhost yunwei]# egrep "\bthe" 1.txt
aabb the ccdd
thexxoo
[root@localhost yunwei]# egrep "the\b" 1.txt
aabb the ccdd
abcthe
grep文件内容过滤
- grep用于查找文件中符合条件的字符串,它能利用正则表达式搜索文件中的字符串,并把匹配到的字符串的行打印出来
- 命令格式:grep [-选项] "查找条件" 目标文件
- 常用选项:
- -n #以行号形式输出
- -i #忽略字符串大小写
- -v #显示不包含匹配的行(排除)
- 常用正则表达式符号
- ^字符串 #显示以该字符串开头的行(匹配以什么什么开头的行)
- $字符串 #显示以该字符串结尾的行(匹配以什么什么结尾的行)
- ^$ #显示空行
- grep命令示例
#过滤包含root关键字的行
[root@localhost ~]# grep root /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
#以行号形式过滤包含root关键字的行
[root@localhost ~]# grep -n root /etc/passwd
1:root:x:0:0:root:/root:/bin/bash
10:operator:x:11:0:operator:/root:/sbin/nologin
[root@localhost ~]# grep -n bash /etc/passwd
[root@localhost ~]# grep -n : /etc/passwd
#忽略大小写过滤
[root@localhost ~]# grep -i -n ssh /etc/passwd
38:sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
#排除包含#号的行
[root@localhost ~]# grep -n -v '^#' /etc/fstab
#过滤以root开头的行
[root@localhost ~]# grep ^root /etc/passwd
#过滤以root结尾的行
[root@localhost ~]# grep -n 'root$' /etc/passwd
[root@localhost ~]# grep -n 'bash$' /etc/passwd
#语法错误示范
[root@localhost ~]# grep -n -v '^#' ^$ /etc/fstab
grep: ^$: 没有那个文件或目录
/etc/fstab:1:
/etc/fstab:9:/dev/mapper/centos-root / xfs defaults 0 0
/etc/fstab:10:UUID=ae55ec6b-973b-498e-a366-f35e14b3d153 /boot xfs defaults 0 0
/etc/fstab:11:/dev/mapper/centos-swap swap
#语法错误示范
[root@localhost ~]# grep -n -v '^#' /etc/fstab | grep -v ^$
1:
9:/dev/mapper/centos-root / xfs defaults 0 0
10:UUID=ae55ec6b-973b-498e-a366-f35e14b3d153 /boot xfs defaults 0 0
11:/dev/mapper/centos-swap swap swap defaults 0 0
#正确语法
[root@localhost ~]# grep -v '^#' /etc/fstab | grep -v ^$ -n
2:/dev/mapper/centos-root / xfs defaults 0 0
3:UUID=ae55ec6b-973b-498e-a366-f35e14b3d153 /boot xfs defaults 0 0
4:/dev/mapper/centos-swap swap swap defaults 0 0
#显示该文件内有效配置的行
[root@localhost ~]# grep -v '^#' /etc/login.defs | grep -v ^$ -n | wc -l
find文件/目录查找命令
- find 命令根据预设的条件递归查找文件或目录所在位置
- 命令格式:find 查找路径 查找条件1 查找条件2 .. [-exec 处理命令 {} ; ]
- –exec 可接额外的命令来处理查找到结果
- {} 代表find查找到的内容被放置{}中
- ; 代表额外处理命令结束
- 常用查找条件
- -type 类型(f文件 d目录 l链接文件)
- -name “文件名”
- -iname 按文件名查找忽略大小写
- -size 文件大小(k、M、G + 大于 - 小于)
- -a (并且)两个条件同时满足
- -o (或者)两个条件满足任意一个即可
- -user 用户名
- -mtime 按日期查找(+ 代表多少天之前 - 代表多少天之内,0代表24小时之内)
- find命令范例
[root@localhost ~]# ls /var/log
#按照类型查找,类型为文件
[root@localhost ~]# find /var/log -type f
[root@localhost ~]# ll boot.log-20210417
[root@localhost ~]# ll /var/log/boot.log-20210417
[root@localhost ~]# ll /var/log/vmware-network.2.log
#按照类型查找,类型为目录
[root@localhost ~]# find /var/log -type d
[root@localhost ~]# ll -d /var/log/tuned
[root@localhost ~]# ll -d /var/log/qemu-ga
#按照类型查找,类型为链接文件
[root@localhost ~]# find /var/log -type l
[root@localhost ~]# fin /etc/ -type l
[root@localhost ~]# find /etc/ -type l
[root@localhost ~]# ll /etc/scl/conf
#按照名字查找
[root@localhost ~]# find /etc/ -name passwd
/etc/passwd
/etc/pam.d/passwd
#按照名字查找,类型为文件
[root@localhost ~]# find /etc/ -name passwd -type f
#按照名字查找,以tab结尾,类型为文件
[root@localhost ~]# find /etc/ -name '*tab' -type f
#按照名字查找,以pass开头,类型为文件
[root@localhost ~]# find /etc/ -name 'pass*' -type f
[root@localhost etc]# find . -name '*.conf' -type f
[root@localhost ~]# find /etc/ -name '*tab*' -type f
#按照名字忽略大小写查找,类型为文件
[root@localhost ~]# find /etc/ -iname FSTAB -type f
/etc/fstab
[root@localhost ~]# find /etc/ -name FSTAB -type f
#查找大于10k的文件
[root@localhost ~]# find /var/log -size +10k -type f
[root@localhost ~]# du -h /var/log/boot.log-20210417
16K /var/log/boot.log-20210417
#查找大于1M的文件
[root@localhost ~]# find /var/log -size +1M -type f
[root@localhost ~]# du -h /var/log/audit/audit.log
2.4M /var/log/audit/audit.log
[root@localhost ~]# find /home -size +1M -type f
#查找小于1M的文件
[root@localhost ~]# find /var/log -size -1M -type f
[root@localhost ~]# du -h /var/log/spooler
0 /var/log/spooler
#查找大于10k并且小于20k,类型为文件
[root@localhost ~]# find /var/log -size +10k -a -size -20k -type f
#-o或者,当有多个条件时,满足任意其中一个即可
[root@thinkmo ~]# find /var/log -name "*.log" -o -size -10k -type f
#查找属于lisi用户的文件/目录
[root@localhost ~]# find /home -user lisi
#查找30天之前被修改过,类型为文件
[root@localhost ~]# find /var/log -mtime +30 -type f
[root@localhost ~]# find /var/log -mtime +10 -type f
#查找10天之内被修改过,类型为文件
[root@localhost ~]# find /var/log -mtime -10 -type f
root@localhost ~]# find /var/log -mtime -30 -type f
#查找30之前被修改过,类型为文件,拷贝到/opt目录下
[root@localhost ~]# find /var/log -mtime -30 -type f -exec cp {} /opt \;
题型:
-
查找/etc/目录下以.conf结尾的文件(只能在/etc这一层目录去查找)
[root@localhost ~]# ls /etc/*.conf
-
查找/etc/目录下以.conf结尾的文件(包含所有的子目录)
[root@localhost ~]# find /etc/ -name '*.conf' -type f
-
查找/var/log/messages 文件,清空文件内容,使用find实现
-
查找/var/log以.log结尾的文件,清空文件内容,使用find实现
sed流式编辑器
- sed是一个非交互的文本编辑器,实现的功能跟vim相同,主要是对文件内容进行输出、删除、替换、复制、剪切、导入、导出等功能
- 命令格式1:前置命令 | sed [选项] '[指令]' 文件名
- 命令格式2:sed [选项] '[指令]' 文件名
- 常用选项:
- -n #屏蔽默认输出,默认sed会将所有的输出结果输出到屏幕中,-n只把sed处理的行输出到屏幕
- -i #直接修改文件内容,如果不加-i选项,并不会真正改变文件的内容
- -r #使用扩展正则,若与其他选项连用应作为首个选项
- 动作指令:
- p #打印指定的行,如:2,4p 打印第234行,如:2p;4p 打印第2行与第4行
- d #删除指定的行,如:2,4d 删除第234行
- s #字符串替换,如:s/旧字串/新字串/
- r #导入文件内容,如:4r 1.txt 在第4行下导入1.txt文件内容
- w #导出文件内容,如:3w 1.txt 将文件第三行内容另存到2.txt文件中
#打印文件第一行内容
[root@localhost yunwei]# sed -n '1p' /etc/passwd
root:x:0:0:root:/root:/bin/bash
#打印文件第三行内容
[root@localhost yunwei]# sed -n '3p' /etc/passwd
daemon:x:2:2:daemon:/sbin:/sbin/nologin
#打印文件第3行到6行
[root@localhost yunwei]# sed -n '3,6p' /etc/passwd
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
#打印文件第3行到6行
[root@localhost yunwei]# head -6 /etc/passwd | tail -4
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
#利用正则表达式匹配以root开头的行(正则表达式要放在//内)
[root@localhost yunwei]# sed -n '/^root/p' /etc/passwd
#匹配以bash结尾的行
[root@localhost yunwei]# sed -n '/bash$/p' /etc/passwd
[root@localhost yunwei]# sed -n '/nologin$/p' /etc/passwd
#打印文件最后一行,打印行号
[root@localhost yunwei]# sed -n '$=' /etc/passwd
70
#打印以root开头的行号
[root@localhost yunwei]# sed -n '/^root/=' /etc/passwd
1
#拷贝文件练习
[root@localhost opt]# cp /etc/passwd /opt/test
#删除文件2到4行
[root@localhost opt]# sed '2,4d' test | wc -l
67
#使用i选项直接修改源文件
[root@localhost opt]# sed -i '2,4d' test
#使用分号分隔
[root@localhost opt]# sed -i '10d;12d' test
[root@localhost opt]# sed -n '$=' test
62
#制作素材
[root@localhost opt]# vim 1.txt
aaaabbbbb
bbbbbaaaa
cccccaaaaa
dddddaaaa
[root@localhost opt]# sed -n '/aaaa/p' 1.txt
aaaabbbbb
bbbbbaaaa
cccccaaaaa
dddddaaaa
#取反删除
[root@localhost opt]# sed -i '/cccc/!d' 1.txt
[root@localhost opt]# cat 1.txt
ccccaaaa
[root@localhost opt]# vim 1.txt
aaaabbbb
ddddaaaa
zzzzaaaa
ccccaaaa
#删除以ccc开头的行
[root@localhost opt]# sed -i '/^cccc/d' 1.txt
[root@localhost opt]# cat 1.txt
aaaabbbb
ddddaaaa
zzzzaaaa
#删除空行
[root@localhost opt]# sed -i '/^$/d' 1.txt
[root@localhost opt]# cat 1.txt
#准备素材
[root@localhost opt]# vim xx.txt
2021 2020 2019 2018
2021 2021 2020 2019
2021 2022 2021 2020
#替换文件每一行匹配到的第一个字串
[root@localhost opt]# sed 's/2021/xxxx/' xx.txt
xxxx 2020 2019 2018
xxxx 2021 2020 2019
xxxx 2022 2021 2020
#替换文件每一行匹配到的第二个字串
[root@localhost opt]# sed 's/2021/xxxx/2' xx.txt
2021 2020 2019 2018
2021 xxxx 2020 2019
2021 2022 xxxx 2020
#替换文件每一行匹配到的所有指定字串
[root@localhost opt]# sed 's/2021/xxxx/g' xx.txt
xxxx 2020 2019 2018
xxxx xxxx 2020 2019
xxxx 2022 xxxx 2020
#将匹配到的第一个字串替换成空
[root@localhost opt]# sed 's/2021//' xx.txt
2020 2019 2018
2021 2020 2019
2022 2021 2020
#将匹配到的第=二字串替换成空
[root@localhost opt]# sed 's/2021//2' xx.txt
2021 2020 2019 2018
2021 2020 2019
2021 2022 2020
#替换时屏蔽默认输出
[root@localhost opt]# sed -n 's/root/xxoo/g' test
[root@localhost opt]# sed -n 's/root/xxoo/gp' test
xxoo:x:0:0:xxoo:/xxoo:/bin/bash
operator:x:11:0:operator:/xxoo:/sbin/nologin
#替换符可以使用任意的特殊符号
[root@localhost opt]# sed 's#2021#xxoo#' xx.txt
xxoo 2020 2019 2018
xxoo 2021 2020 2019
xxoo 2022 2021 2020
[root@localhost opt]# sed 's,2021,xxoo,' xx.txt
xxoo 2020 2019 2018
xxoo 2021 2020 2019
xxoo 2022 2021 2020
[root@localhost opt]# sed 's!2021!xxoo!' xx.txt
xxoo 2020 2019 2018
xxoo 2021 2020 2019
xxoo 2022 2021 2020
[root@localhost opt]# sed 's;2021;xxoo;' xx.txt
xxoo 2020 2019 2018
xxoo 2021 2020 2019
xxoo 2022 2021 2020
[root@localhost opt]# sed 's*2021*xxoo*' xx.txt
xxoo 2020 2019 2018
xxoo 2021 2020 2019
xxoo 2022 2021 2020
[root@localhost opt]# sed 's:2021:xxoo:' xx.txt
xxoo 2020 2019 2018
xxoo 2021 2020 2019
xxoo 2022 2021 2020
#将文件中/bin/bash替换成/bin/sh
[root@localhost opt]# sed -n 's/\/bin\/bash/\/bin\/sh/gp' test
[root@localhost opt]# sed -n 's,/bin/bash,/bin/sh,gp' test
#使用sed给文件1-7行批量添加注释
[root@localhost opt]# sed -n '1,7s/^/#/p' test
#使用sed给文件1-7行批量添加注释,直接修改源文件
[root@localhost opt]# sed -i '1,7s/^/#/' test
#批量去除1-7行的注释
[root@localhost opt]# sed -n '1,7s/^#//' test
#批量去除1-7行的注释,直接修改源文件
[root@localhost opt]# sed -i '1,7s/^#//' test
#将文件中所有的数字替换成空
[root@localhost opt]# sed -n 's/[0-9]//gp' test
#将文件中所有的英文字母替换成空
[root@localhost opt]# sed -n 's/[a-Z]//gp' test
#准备素材
[root@localhost opt]# vim a.txt
xxxxxxx
yyyyyyy
zzzzzz
#将a.txt文件内容导入到test文件中,默认读一行导一遍
[root@localhost opt]# sed 'r/opt/a.txt' test
#指定导入的行,导入到test文件第一行下边
[root@localhost opt]# sed '1r/opt/a.txt' test
root:x:0:0:root:/root:/bin/bash
xxxxxxx
yyyyyyy
zzzzzz
#指定连续导入的行
[root@localhost opt]# sed '1,3r/opt/a.txt' test
root:x:0:0:root:/root:/bin/bash
xxxxxxx
yyyyyyy
zzzzzz
root:x:0:0:root:/root:/bin/bash
xxxxxxx
yyyyyyy
zzzzzz
root:x:0:0:root:/root:/bin/bash
xxxxxxx
yyyyyyy
zzzzzz
#将a.txt文件第一行内容导出到b.txt文件中
[root@localhost opt]# sed '1w b.txt' a.txt
[root@localhost opt]# cat b.txt
xxxxxxx
awk编程语言
-
awk编程语言/数据处理引擎
-
创造者:Aho Winberger Kernighan
-
基于模式匹配检查输入文本,逐行处理并输出,获取指定的数据
-
awk过滤数据时支持仅打印某一列,如:第2列、第4列...
-
awk命令格式1:awk [选项] '条件1{指令} 条件2{指令}' 文件名
-
awk命令格式2:前置命令 | awk [选项] '条件{指令}'
-
常用指令:print 是最常用的打印指令
-
常用选项:-F #指定分隔符,如不指定分隔符,默认以空格或tab键为默认分隔符,可通过[]集合匹配多种单个字符
-
awk内置变量:$1第一列,$2第二列,$3第三列,依次类推,NR文件当前行号,NF文件当前列数
-
命令格式1示例:
#准备素材
[root@localhost opt]# vim test.txt
hello the woman
welcome to china
#打印文件的第一列
[root@localhost opt]# awk '{print $1}' test.txt
hello
welcome
#打印文件第一列和第三列
[root@localhost opt]# awk '{print $1,$3}' test.txt
hello woman
welcome china
#打印passwd文件第一列(默认没有空格与tab键作为分隔符,打印文件所有内容)
[root@localhost opt]# awk '{print $1}' /etc/passwd
#手动指定以:作为分隔,打印文件第一列
[root@localhost opt]# awk -F: '{print $1}' /etc/passwd
#打印文件第一列与第七列
[root@localhost opt]# awk -F: '{print $1,$7}' /etc/passwd
#通过[]集合匹配多种单个字符作为分隔符,打印用户名与解释器字段
[root@localhost opt]# awk -F[:/] '{print $1,$10}' /etc/passwd
#通过正则表达式过滤以root开头的行
[root@localhost opt]# awk -F: '/^root/{print}' /etc/passwd
root:x:0:0:root:/root:/bin/bash
#通过正则表达式过滤以root开头的行,打印第1列与第7列
[root@localhost opt]# awk -F: '/^root/ {print $1,$7}' /etc/passwd
root /bin/bash
#打印文件每一行与每一行的列数
[root@localhost opt]# awk -F: '{print NR,NF}' /etc/passwd
#打印文件每一行与每一行的列数,并打印最后一列
[root@localhost opt]# awk -F: '{print NR,NF,$NF}' /etc/passwd
#通过常量打印执行的列
[root@localhost opt]# awk -F: '{print $1,"用户的解释器为:",$7}' /etc/passwd
root 用户的解释器为: /bin/bash
#匹配第一列包含root的行
[root@localhost opt]# awk -F: '$1~/root/' /etc/passwd
root:x:0:0:root:/root:/bin/bash
#排除第7列noloogin的行,打印第1列与第7列
[root@localhost opt]# awk -F: '$7!~/nologin/{print $1,$7}' /etc/passwd
#利用扩展正则过滤,以root或者adm开头的行,打印第1列与第7列
[root@localhost opt]# awk -F: '/^(root|adm)/{print $1,$7}' /etc/passwd
root /bin/bash
adm /sbin/nologin
- awk使用数值/字符串比较设置条件
- 等于: ==
- 不等于: !=
- 大于: >
- 大于等于: >=
- 小于: <
- 小于等于:<=
#打印行号等于3
[root@localhost opt]# awk 'NR==3{print}' /etc/passwd
daemon:x:2:2:daemon:/sbin:/sbin/nologin
#使用sed更加方便打印某一行
[root@localhost opt]# sed -n '3p' /etc/passwd
daemon:x:2:2:daemon:/sbin:/sbin/nologin
#打印文件中第3列大于等于1000,打印第1列,第3列,第7列
[root@localhost opt]# awk -F: '$3>=1000{print $1,$3,$7}' /etc/passwd
lisi 1000 /bin/bash
#打印文件中第三列小于1000,打印第1列,第3列,第7列
[root@localhost opt]# awk -F: '$3<1000{print $1,$3,$7}' /etc/passwd
root 0 /bin/bash
#打印文件中第3列大于500并且小于1000,打印第1列,第3列,第7列
[root@localhost opt]# awk -F: '$3>500 && $3<1000 {print $1,$3,$7}' /etc/passwd
polkitd 999 /sbin/nologin
#打印第一列不等于root的行
[root@localhost opt]# awk -F: '$1!="root"{print}' /etc/passwd
- awk过滤时机:awk ‘BEGIN{指令} {指令} END{指令}’ 文件名
- BEGIN{指令} #读取文件内容之前执行指令,指令执行一次,行前处理
- {指令} #读取文件过程中执行,指令逐行执行,读一行,执行一次
- END{指令} #读取文件内容结束后执行指令,指令执行一次,行后处理
#BEGIN{指令}行前处理
[root@localhost opt]# awk 'BEGIN{print "正在处理中"}'
正在处理中
#定义变量
[root@localhost opt]# awk "BEGIN{x=10;print x}"
10
#四则运算
[root@localhost opt]# awk "BEGIN{x=10;print x+5}"
15
[root@localhost opt]# awk "BEGIN{x=10;print x+5}"
15
[root@localhost opt]# awk "BEGIN{x=10;print x-5}"
5
[root@localhost opt]# awk "BEGIN{x=10;print x*5}"
50
[root@localhost opt]# awk "BEGIN{x=10;print x/5}"
2
[root@localhost opt]# awk "BEGIN{print 10+10}"
20
[root@localhost opt]# awk "BEGIN{print 10-5}"
5
[root@localhost opt]# awk "BEGIN{print 10*2}"
20
[root@localhost opt]# awk "BEGIN{print 10/3}"
3.33333
[root@localhost opt]# awk "BEGIN{print 10%3}"
1
#通过awk统计系统里使用bash解释器的用户有什么个?
[root@localhost opt]# awk 'BEGIN{x=0}/bash$/{x++}END{print x}' /etc/passwd
27
[root@localhost opt]# awk '/bash$/{x++}END{print x}' /etc/passwd
27
- awk分支结构
- if单分支格式:if(条件)
- if双分支格式:if(条件){指令}else
#if单分支统计passwd文件中UID大于或等于1000的用户个数
awk -F: '{if($3>=1000){x++}} END{print x}' /etc/passwd
if($3>=1000){x++}
[root@localhost ~]# awk -F: '{if($3>=1000){x++}}END{print x}' /etc/passwd
#if双分支统计passwd文件中UID大于等于1000的用户,和小于1000的用户个数
[root@localhost ~]# awk -F: '{if($3>=1000){i++} else{x++}} END{print i,x}' /etc/passwd
- awk数组
- 定义数组格式1:数组名[下标]=值
- 定义数组格式2:数组名=值
- 数组的用法:for(变量名 in 数组名)
#awk定义数组方式
[root@localhost ~]# awk 'BEGIN{x[0]=10;x[1]=20;print x[0],x[1]}'
10 20
#awk定义数组方式
[root@localhost ~]# awk 'BEGIN{x[0]++;print x[0]}'
1
- awk循环结构
- 命令格式:for(变量名 in 数组名)
[root@localhost ~]# awk 'BEGIN{a[0]=00;a[1]=11;a[2]=22;for(i in a){print i,a[i]}}'
0 0
1 11
2 22
- awk命令格式2:前置命令 | awk [选项] '条件{指令}'
#通过awk打印剩余内存
[root@localhost opt]# free -h | grep Mem | awk '{print $4}'
134M
[root@localhost opt]# free -h | awk '/Mem/{print $4}'
134M
#用awk写一个监控脚本,监控网卡的进出口流量
[root@localhost ~]# vim while_liuliang.sh
#!/bin/bash
while :
do
clear
ifconfig ens32 | awk '/inet /{print "IP:",$2}'
ifconfig ens32 | awk '/RX p/{print "入口流量:",$5}'
ifconfig ens32 | awk '/TX p/{print "出口流量:",$5}'
sleep 0.1
done
#使用awk过滤系统根分区使用情况
[root@localhost ~]# df -h | grep '/$' | awk '{print $4}' | awk -FG '{print $1}'
51
#过滤根分区剩余空间与物理内存空间
[root@localhost ~]# vim df_free.sh
#!/bin/bash
df -h | grep '/$' | awk '{print "根分区剩余空间:",$4}'
free -h | grep Mem | awk '{print "物理内存剩余空间:", $4}'
[root@thinkmo ~]# df -h | grep /$ | awk '{print $4}' | awk -FG '{print $1}'
13
#通过awk统计用户登录系统的次数
[root@localhost ~]# who | awk '{ip[$1]++}END{for(i in ip)print i,ip[i]}'
root 1