扩展正则表达式元字符
- 扩展正则表达式是对基础正则表达式的扩充深化
- 扩展元字符
awk工具
awk 是一个功能强大的编辑工具,逐行读取输入文本,并根据指定的匹配模式进行查找,对符合条件的内容进行格式化输出或者过滤处理,可以在无交互的情况下实现相当复杂的文本操作,被广泛应用于Shell脚本,完成各种自动化配置任务。
awk工具介绍
- 功能强大的编辑工具
- 无交互的情况下实现复杂的文本操作
- 命令格式
awk 选项 '模式或条件{编辑指令}' 文件1 文件2
awk f 脚本文件 文件1 文件2
awk工作原理
逐行读取文本,默认以空格为分隔符进行分隔,将分隔所得的各个字段保存到内建变量中,并按模式或者条件执行编辑命令
awk内置变量
- FS:指定每行文本的字段分隔符,缺省为空格或制表位
- NF:当前处理的行的字段个数
- NR:当处理的行的行号(序数)
- $0:当前处理的行的整行内容
- $n:当前处理行的第n个字段(第n列)
- pFILENAME:被处理的文件名
- RS:数据记录分隔,默认为\n,即每行为一条记录
awk用法示例
按行输出文本
[root@localhost~]# awk -F: '{print $1,$7}' /etc/passwd
没有条件指定,输出第一字段到第七字段,操作文件为 /etc/passwd
[root@localhost~]# awk -F: '/^lisi/{print $1,$7}' /etc/passwd
指定条件为lijin,输出第一字段和第七字段
lisi(第一字段) /bin/bash(第七字段)
[root@localhost~]# awk -F: '/\/sbin\/nologin$/{print $1,$7}' /etc/passwd
输出以'/sbin/nologin'结尾的全部输出,指定条件
[root@localhost~]# awk -F: 'NR==6{print $1,$7}' /etc/passwd
输出第六行的第一字段和第七字段
[root@localhost~]# awk -F: 'NR==6,NR==10{print $1,$7}' /etc/passwd
[root&#64;localhost~]# awk -F: &#39;(NR>&#61;6)&&(NR<&#61;10){print $1,$7}&#39; /etc/passwd
&#xff08;具体范围内&#xff09;输出第六行到第十行的第一字段和第七字段&#xff0c;两种方法结果一样
[root&#64;localhost~]# awk -F: &#39;(NR&#61;&#61;6)||(NR&#61;&#61;10){print $1,$7}&#39; /etc/passwd
||指定输出第六行和第十行的第一字段和第七字段
[root&#64;localhost~]# awk -F: &#39;(NR&#61;&#61;6)||(NR&#61;&#61;10){print}&#39; /etc/passwd
指定输出第六行和第十行
[root&#64;localhost~]# awk -F: &#39;(NR%2)&#61;&#61;1{print}&#39; /etc/passwd
输出所有奇数行
[root&#64;localhost~]# awk -F: &#39;(NR%2)&#61;&#61;0{print}&#39; /etc/passwd
输出所有偶数行
[root&#64;localhost~]# awk -F: &#39;/^root/{print}&#39; /etc/passwd
输出以&#39;root&#39;开头的行
[root&#64;localhost~]# awk &#39;BEGIN {x&#61;0};/\/bin\/bash$/{x&#43;&#43;};END {print x}&#39; /etc/passwd
统计以&#39;/bin/bash&#39;结尾的行数
按字段输出文本
[root&#64;localhost~]# vi test.txt #以这篇文档为例
[root&#64;localhost~]# awk &#39;{print $3}&#39; test.txt
输出每行中的第三个字段&#xff08;以空格或制表分隔&#xff09;
[root&#64;localhost~]# awk &#39;{print $1,$3}&#39; test.txt
输出每行中第一个字段和第三个字段
[root&#64;localhost~]# awk -F: &#39;$2&#61;&#61;"!!"{print $1}&#39; /etc/shadow
[root&#64;localhost~]# awk &#39;BEGIN {FS&#61;":"};$2"!!"{print}&#39; /etc/shadow
输出密码为空的用户的shadow记录 &#xff08;两种方法&#xff09;
[root&#64;localhost~]# awk -F: &#39;$7~"sh"{print $1}&#39; /etc/passwd
输出第七个字段中包含/bash 的行的第一个字段
[root&#64;localhost~]# awk -F: &#39;($7!&#61;"/bin/bash")&&($7!&#61;"/sbin/nologin")&#39;{print} /etc/passwd
输出第七个字段既不为/bin/bash也不为/sbin/nologin的所有行
通过管道、双引号调用Shell命令
[root&#64;localhost~]# awk -F: &#39;/bash$/&#39;{print} /etc/passwd | wc -l
[root&#64;localhost~]# grep -c "bash$" /etc/passwd
调用&#39;wc -l&#39;命令统计使用&#39;bash&#39;的用户个数 (两种方法)
[root&#64;localhost~]# awk &#39;BEGIN {while ("w" | getline) n&#43;&#43;; {print n-2}}&#39;
调用w命令,并用来统计在线用户数
[root&#64;localhost~]# awk &#39;BEGIN {"cat /etc/hostname" | getline;print $0}&#39;
调用hostname&#xff0c;输出当前的主机名
sort工具
sort常用选项
- -f:忽略大小写
- -b:忽略每行前面的空格
- -M:按照月份进行排序
- -n:按照数字进行排序
- -r:反向排序
- -u:等同于uniq&#xff0c;表示相同的数据仅显示一行
- -t:指定分隔符&#xff0c;默认使用[Tab]键分隔
- -o<输出文件>:将排序后的结果转存至指定文件
- -k:指定排序区域
[root&#64;localhost~]# sort /etc/passwd
按行开头字母a、b、c、d......进行排序&#xff0c;操作文件为/etc/passwd
[root&#64;localhost~]# sort -t ":" -k 3 /etc/passwd
将每行第三个字段排序
[root&#64;localhost~]# sort -n -t ":" -k 3 /etc/passwd
将每行第三个字段按数字排序
[root&#64;localhost~]# sort -n -t ":" -rk 3 /etc/passwd
将每行第三个字段按数字反向排序
[root&#64;localhost~]# sort -n -t ":" -rk 3 /etc/passwd -o a.txt
将/etc/passwd内容输出到a.txt
uniq工具
Uniq工具在 Linux系统中通常与 sort命令结合使用&#xff0c;用于报告或者忽略文件中的重复行
- -c:进行计数
- -d:仅显示重复行
- -u:仅显示出现一次的行
[root&#64;localhost~]# vi a
创建文件测试
[root&#64;localhost~]# uniq a
重复行做合并
[root&#64;lo·calhost~]# uniq -c a
进行计数
[root&#64;localhost~]# uniq -d a
仅显示重复行
[root&#64;localhost~]# uniq -cd a
计数显示重复行
[root&#64;localhost~]# uniq -u a
输出出现一次的行
tr 工具
tr 命令常用来对来自标准输入的字符进行替换、压缩和删除。
tr具体的命令语法格式为:tr [选项] [参数]
其常用选项包括以下内容。
- -c:取代所有不属于第一字符集的字符
- -d:删除所有属于第一字符集的字符
- -s:把连续重复的字符以单独一个字符表示
- -t:先删除第一字符集较第二字符集多出的字符&#xff0c;做替换
[root&#64;localhost~]# echo "KGC" | tr &#39;A-Z&#39; &#39;a-z&#39;
将大写KGC转换为kgc
[root&#64;localhost~]# echo "abcd efgh" | tr -d &#39;ae&#39;
删除字符中某些字符 a和e被删除
[root&#64;localhost~]# echo "abcccc d e f ghillllllllll" | tr -s &#39;cl&#39;
压缩输入中重复的字符 c和l被压缩成一个
[root&#64;localhost~]# echo abcabc123 | tr -t &#39;abc&#39; &#39;t&#39;
tbctbc123
abcabc中的a对应t&#xff0c;a替换成t
[root&#64;localhost~]# echo abcabc123 | tr -t &#39;abc&#39; &#39;tt&#39;
ttcttc123
abcabc中的ab对应tt&#xff0c;ab替换成tt
[root&#64;localhost~]# echo abcabc123 | tr -t &#39;abc&#39; &#39;ttt&#39;
tttttt123
abcabc中的abc对应ttt&#xff0c;abc替换成ttt
[root&#64;localhost~]# echo abcabc123 | tr -t &#39;ab&#39; &#39;ttt&#39;
ttcttc123
先删除第一字符集较第二字符集多出的字符&#xff0c;做替换