sed命令疑难问题
sed -ri ‘/^H+/a 11111111111’ /etc/sysconfig/network
在文件里在以至少一个H开头的行追加111111111
sed -ir ‘/^H+/a 11111111111’ /etc/sysconfig/network
追加不会成功。在 /etc/sysconfig/network备份的文件里加上后缀r
注:sed -r -i分开来写就不会出现上述问题
知识要点
awk命令的工作原理
awk的基本命令
awk的内部变量
awk的自定义变量
awk的流程控制语句
awk命令的工作原理
1.gawk (gnu awk)
Unix中awk的GNU版本,完成grep和sed的工作
支持数学运算,流程该控制内置大量的变量和函数
2.awk命令工作原理
与sed一样, 均是一行一行的读取、处理
sed作用于一整行的处理, 而awk将一行分成数个字段来处理
3.awk命令的简要处理流程4.awk的用-F来指定分隔符
默认的字段分隔符是任意空白字符(空格或者TAB)
举例对比cut和awk的区别
5.awk的数据字段变量
$0表示整行文本
$1表示文本中第一个数据字段
$2表示文本中第二个数据字段
$n表示文本中第n个数据字段
awk命令的语法
1.awk命令的完整语法2.awk的命令的执行过程
执行BEGIN{commands}语句块中的语句
从文件或stdin中读取第1行,
有无模式匹配, 若无则执行{}中的语句,
若有则检查该整行与pattern是否匹配, 若匹配, 则执行{}中的语句,
若不匹配则不执行{}中的语句,接着读取下一行
重复这个过程, 直到所有行被读取完毕
执行END{commands}语句块中的语句
3.awk命令的基本语法awk的指令一定要用单引号括起
awk的动作一定要用花括号括起
模式可以是正则表达式、条件表达式或两种组合,条件表达式不能加/ /
如果模式是正则表达式要用/定界符
多个动作之间用;号分开
awk基本命令示例
1.awk基本命令示例
awk ‘/bash/’ /etc/passwd
只有模式没有动作结果和grep一样,显示$0
查找文件内容含有bash的行,整行输出
who | awk '{print $2}‘
只有动作没有模式就直接执行动作
awk -F: ‘/^h/{print $1,$7}’ /etc/passwd
print执行显示功能将文本输出到STDOUT
以冒号为分隔符,显示以h开头的行的第一列和第七列
awk -F: ‘/[h]/{print $1,$7}’ /etc/passwd
不显示以h开头的行的第一列和第七列 [^h]表示不以h开头的行
awk -F ‘[?]’ ‘{print $1,$10}’ /etc/passwd
以:或者/作为分隔符显示第1列和第10列
awk命令的语法
awk命令的操作符
正则表达式和bash一致
数学运算:+,-,*,/, %,++(自加一),- -(自减一)
逻辑关系符:&&, ||, !
比较操作符:>,<,>=,!=,<=,== ~ !~
文本数据表达式:== (精确匹配)
波浪号表示匹配后面的模式,想要某个字段进行模式匹配,就要使用(波浪符号) 使用格式: 字段 ~ /模式/
who | awk '$2 ~ /pts/{print $1}‘
第二列要包含有pts,然后输出第一列
awk -F: ‘$3 ~ /<…>/ {print $1,$3}’ /etc/passwd
冒号作为分隔符,第三列是三个字符的输出第一列和第三列
seq 100 | awk ‘$1 % 5 == 0 || $1 ~ /^1/{print $1}’
输出整除5的数和以1开头的数
awk -F: ‘$1 == “root”{print $1,$3}’ /etc/passwd
第一个字段等于root就输出第一个字段和第三个字段
awk基本命令示例
1.awk基本命令示例
awk -F: ‘$3>=500{print $1}’ /etc/passwd
显示UID大于等于500行的用户名
awk -F: ‘$3>=500 && $3<=60000{print $1}’ /etc/passwd
显示普通用户名
awk -F: ‘$3 != $4 {print $1}’ /etc/passwd
显示UID不等于GID的用户名
awk -F: ‘/^h/ && /bash/{print $1}’ /etc/passwd
显示用户名以h开头的普通用户
ps aux | awk ‘$2 <=10 {print $11}’
2.awk基本命令示例
awk ‘BEGIN{print “line one\nline two\nline three”}’
显示后面三行
awk ‘END{print “line one\nline two\nline three”}’
按ctrl+D开始显示后面三行
awk ‘BEGIN{print “start…”}{print $1}END{print “end…”}’ test
显示文件的内容并在前面加上start和后面加上end
awk ‘BEGIN{i=0}{i++}END{print i}’ /etc/passwd
显示文件的行数
awk命令的变量
1.awk命令的内部变量awk基本命令示例
1.awk基本命令示例
awk ‘{print NF}’ /etc/grub.conf
显示每行的字段数目
awk ‘{print
1
,
1,
1,NF}’ /etc/grub.conf
显示每行的第一字段 和最后一个字段
awk ‘{print NR,$0}’ /etc/grub.conf
显示每行的内容和行号
awk -F: ‘BEGIN{OFS="—"}{print $1,KaTeX parse error: Expected 'EOF', got '}' at position 2: 7}̲' /etc/passwd 显…/{print NR,$1}END{print NR}’ /etc/passwd
显示符合模式的用户名和所在的行号最后显示总行号
awk ‘NR==3,NR=5’ /etc/grub.conf
显示文件的3到5行
awk ‘NR<=10’ /etc/fstab
显示文件的前10行
awk基本实验案例1
1.分析下面三条命令的区别,为什么
awk ‘BEGIN{print NR}’ /etc/passwd
awk ‘{print NR}’ /etc/passwd
awk ‘END{print NR}’ /etc/passwd
2.分析下面命令的执行结果
awk -F: ‘{print $NR}’ /etc/passwd
awk -F: ‘{print NR, NF, $1, $NF, $(NF-1)}’ /etc/passwd
3.只显示df -h结果的第一列文件系统
4.显示passwd文件的第5行和第10行的行号和用户名
awk基本实验案例2
使用NF变量显示passwd文件倒数第二列的内容
显示passwd文件中第5到第10行的用户名
显示passwd文件中第7列不是bash的用户名
显示passwd文件中行号是5结尾的行号和行
用ifconfig只显示ip(不能使用tr或者cut命令)
使用awk显示eth0的入站流量和出站流量(字节)
使用awk命令统计以r开头的用户数目,显示如下效果
awk命令的变量
1.awk命令的引用shell变量
-v 引入shell变量
2.分析下面脚本的意思
awk命令的函数
awk编程语言内置了很多函数
例如利用length计算字符数目的函数来检查有无空口令用户
显示文件中超过60个字符的行
awk命令的结构化语句
1.if语句
单分支awk -F: ‘{if($1 ~ /<…>/)print $0}’ /etc/passwd
awk -F: ‘{if($3 >= 500)print $1,$7}’ /etc/passwd
2.双分支
awk -F: ‘{if($3 != 0) print $1 ; else print $3}’ /etc/passwd
3.多分支
awk -F: ‘{if($1==“root”) print $1; else if($1==“ftp”) print $2; else if($1==“mail”) print $3; else print NR}’ /etc/passwd
awk命令if语句案例
监控多台主机的磁盘分区一旦某台被监控主机的任一分区使用率大于80%, 就给root发邮件报警
实验案例3
检查/var/log/secure日志文件,如果有主机用root用户连接服务器的ssh服务失败次数超过10次(10次必须使用变量),就将这个IP地址加入/etc/hosts.deny文件拒绝其访问,如果这个IP已经存在就无需重复添加到/etc/hosts.deny文件