grep:文本过滤(模式匹配工具)
sed: 文本流编辑工具
awk: 文本报告生成器
常用选项:
–color=auto : 对匹配到的文本着色显示
-v: 显示不能够被pattern匹配到的行
-i:忽略大小写
-o:仅显示匹配到的字符串
-q:静默模式,不输出任何信息
-A #: after 后#行
-B #: before 前#行
-C #: context 前后各#行
-E : 使用ERE(使用扩展正则表达式) 等同于egrep
grep "^[Ss]" /proc/meminfo
grep -i "^s" /proc/meminfo
2.显示/etc/passwd文件中不以/bin/bash结尾的行
reg: /bin/bash$
grep -v "/bin/bash$" /etc/passwd
3.如果root用户存在,显示其默认的shell程序 位置锚定
[root@test tmp]# id root > /dev/null && grep "^root\>" /etc/passwd | cut -d: -f7
4.找出/etc/passwd中的两位或三位数 ; 贪婪匹配 --> 继续往后匹配
reg: [[:digit:]]{2,3}
[root@test tmp]# grep "\<[[:digit:]]\{2,3\}\>" /etc/passwd
[root@test tmp]# grep "\<[0-9]\{2,3\}\>" /etc/passwd
[root@test tmp]# grep -E "\<[0-9]{2,3}\>" /etc/passwd -- 使用ERE
5.显示/etc/grub2.cfg文件中,至少以一个空白字符开头的且后面存非空白字符行
reg : [[:space:]]+[[:space:]]\
[root@test tmp]# grep "^[[:space:]]\+[^[:space:]]\+" /etc/grub2.cfg
6.找出“netstat -tan"命令的结果中以’LISTEN’后跟0、1或多个空白字符结尾的行
reg: LISTEN[[:space:]]*$
netstat -tan | grep "LISTEN[[:space:]]*$"
7.添加用户bash、testbash以及nologin(其shell为/sbin/nologin),然后找出/etc/passwd文件中用户名同shell名的行
useradd bash && useradd testbash && useradd nologin -s /sbin/nologin
bash:x:1010:1013::/home/bash:/bin/bash
nologin:x:1012:1015::/home/nologin:/sbin/nologin
reg: [[:alnum:]]\+
扩展正则:
[root@test tmp]# grep -E "^(\<[[:alnum:]]+\>).*\1$" /etc/passwd
基本正则:
[root@test tmp]# grep "^\(\<[[:alnum:]]\+\>\).*\1$" /etc/passwd
\1 : 引用分组的内容;保证用户名和shell同名
awk方式:
[root@test tmp]# awk -F'[:/]' '$1==$NF{print $0}' /etc/passwd
Sed: 文本流编辑器; 非交互式,能同时处理多个文件多个行的内容,
不对源文件改动,把整个文件输出到屏幕;还可以对源文件改动,但是不会在输出到屏幕上返回结果
语法格式:
[root@test tmp]# sed --help
Usage: sed [OPTION]... {script-only-if-no-other-script} [input-file]...
sed的命令格式: sed [options] ‘sed command’ filename
sed的脚本格式: sed [options] -f ‘sed script’ filename
常用选项:
-n : 只打印模式匹配的行
-e :直接在命令行模式上进行sed动作编辑(默认选项)
-f : 将sed的动作写在一个文件中,用-f “sed script” 执行 script文件中的sed动作
-r :支持扩展正则表达式
-i :直接去修改文本内容
使用行号和行号范围
x: 行号
x,y : 从x,y行
x,y! : 从x,y行之外
/pattern : 查询包含模式的行
/pattern/,/pattern/ : 查询包含两个模式的行
/pattern/,y : y行内查询包含匹配模式的行
x,/pattern/: x行后查询包含匹配模式的行
p : 打印匹配的行
= : 显示文件行号
a\: 指定行号后添加新文本
i\: 指定行号前添加新文本
d: 删除定位行
c\: 用新文本内容替换定位到的行
w filename: 写文本到另一个文件中
r filename: 读另一文本到本文件中
s /// : 替换
替换标记:
g: 行内全局替换
p:显示替换成功的行
w:将替换成功后的内容保存到指定文件中
分隔符: /// --> @@@作为分隔符也是可以的
q: 第一个模式匹配后立即退出
{}: 在定位执行行的命令组,用;进行分隔
g: 将模式2粘贴到/pattern n/ 位置
[root@test tmp]# sed -n '1,4p' fstab
[root@test tmp]# sed -n '/xfs/p' fstab
[root@test tmp]# sed -n '/^UUID=.*/p' fstab
[root@test tmp]# sed -n '/^UUID=.*/=' fstab
[root@test tmp]# sed -i '2a\192.168.10.10 node1' /etc/hosts
[root@test tmp]# sed -i '3d' /etc/hosts
[root@test tmp]# sed -i '/^UUID=.*/c\test......' fstab
[root@test tmp]# sed '/^#.*/w fstab_part' fstab
[root@test tmp]# sed -i '2r fstab_part' 1.txt
10.将1.txt文本中hello替换成全局替换成大写
[root@test tmp]# sed -i 's/hello/HELLO/g' 1.txt
将替换的内容保存至1_part.txt文本中
[root@test tmp]# sed 's/HELLO/Hi/g w 1_part.txt' 1.txt
注意事项: 在进行编辑操作的时候,尽量先默认在命令行输出;保证正确的情况下,再使用-i参数对其文本进行修改
sed -n 'n;p' /etc/passwd | cut -d: -f1
sed -i '1,3s@\(^.\)@#\1@g' /tmp/grub.conf
1,3s@\(^.\)@#\1@g
取消注释行:
sed '1,10s@^#\(.*\)$@\1@g' 1.txt
^#+(.*)$ —> 查询内容:所有#开头的行
\1 替换的内容 (.*)
awk是一个文本分析工具,相对于grep的查找,sed的编辑,awk优势在于对数据分析后形成的报告
简单来说: awk就是文本逐行读入,以空格为模式分隔符进行切片,切片部分再进行各种分析处理
[root@test tmp]# awk --help
Usage: awk [POSIX or GNU style options] -f progfile [--] file ...
Usage: awk [POSIX or GNU style options] [--] 'program' file ...
常用选项:
-F: 指定分隔符
-v:指定用户定义变量
-f:从脚本文件读取awk命令
pattern:
模式可以是以下任意一种:
正则表达式: 使用通配符的一些扩展集
关系表达式: 使用运算符进行操作,可以是字符串或者数据的比较测试
模式匹配表达式 :用运算符 ~(匹配) 和 ~!(不匹配)
BEGIN 语句块, pattern语句块,END语句块
action:
动作: 由一个或多个命令、函数表达组成;之间用逗号分隔开来,并位于大括号之内
主要部分是:变量 数组赋值 输出命令 内置函数 控制流语句等等
[root@node1 ~]# awk -F: '{print $1}' /etc/passwd
[root@test tmp]# awk -F: '{print $1"用户shell为:"$7}' /etc/passwd
$0: 代表整行内容
[root@node1 ~]# awk -F: '$4==188 {print $1}' /etc/passwd
[root@node1 ~]# awk -F: '/^test/{print $1,$4}' /etc/passwd
[root@node1 ~]# awk -F: -va=3 '{print $1,$1+$a}' /etc/passwd
[root@node1 ~]# awk -F: '{print "filename:" FILENAME ",linenumber:" NR ",columns:" NF ",linecontent:"$0}' /etc/passwd
[root@node1 ~]# awk -F: 'BEGIN{print"-------------------------\n"}{printf "username:%-16s\tsuserid:%-16s\n",$1,$4}END{printf N "%-4s records\n",NR}' /etc/passwd
使用-F指定分隔符,-v传递变量参数,输出时有print和printf格式化输出,并且输出多列用,号分割,并且添加BEGIN和END字段。
BEGIN语句块是awk分析处理前做的事情;END语句块是awk分析处理后做的事情
算数运算符: + - * /
赋值运算符: = += ..
逻辑运算符: || &&
关系运算符: == != > <
正则运算符: (~,~!) ---> (匹配正则表达式,不匹配正则表达式)
NR:已读的记录数 -- 行数
NF:浏览记录的域的个数 --- 列数(字段数)
ARGC: 命令行参数个数
ARGV: 命令行参数排序
FILENAME: awk浏览的文件名称
FNR: 浏览文件的记录数
FS: 设置输入域分隔符,等价于命令-F选项
.....
if (condition) action
if (condition) action else action
for (initialisation; condition; increment/decrement) action
while (condition) action
break:用以结束循环
Continue:语句用于在循环体内部结束本次循环,从而直接进入下一次循环迭代
数组使用的语法格式:array_name[index]=value
删除数组:delete array_name[index]
多维数组
函数:
https://www.runoob.com/w3cnote/awk-built-in-functions.html#b2