一,正则表达式 w匹配数字、字母、下划线 egreproowuser找roo后面是数字、字母、下划线的字符串 s匹配空格、tab键 egreproosuser找roo后面是1个空格或者tab键打出来的空格的字符串,如果没有 就不输出 二,sed其他指令 a行下追加i行上添加c替换整行 seda666user所有行的下面追加666 sed1a666user第1行的下面追加666 sedbina666user在以bin开头的行的下面追加666 sedi666user所有行的上面添加666 sed5i666user第5行的上面添加666 sedi666user最后1行的上面添加666 sedc666user所有行都替换成666 sed1c666user替换第1行为666 三,awk 可以实现精确搜索并输出,逐行处理 1,前置指令awk选项条件指令 2,awk选项条件指令被处理文档 选项F定义分隔符 指令print 条件字符串 内置变量1第一列2第二列3第三列。。。 0所有列NR行号NF列号 〔rootproxyopt〕catabc。txt准备素材 hellotheworld welcometobeijing awk{print}abc。txt输出所有 awkto{print}abc。txt输出有to的那行 awk{print2}abc。txt输出所有行的第2列 awkto{print1}abc。txt输出有to的那行的第1列 awk{print0}abc。txt输出所有行所有列 awk{print0,1}abc。txt输出所有行所有列和第1列 awk{printNR}abc。txt输出所有行的行号 awk{printNR,0}abc。txt输出所有行的行号,所有列 awk{printNR,NF}abc。txt输出所有行的行号,列号(有几列) awkbin{printNR}user找以bin开头的行,显示该行的行号 awkbin{printNR,0}user找以bin开头的行,显示该行的 行号,所有列 awk{printNF}user输出所有行的列号(每行有几列) awkF:{print1}user文档中如果没有空格,可以用F修改分 隔符 awkF:{print1,6}user使用冒号作为列的分隔符,显示 第1、6列 awkF:{print1的家目录是6}user还可以输出常量,加 双引号即可 awkF:{print1的解释器是7}user 收集根分区剩余容量 dfhawk{print4}使用dfh作为前置指令交给awk处理 找到以结尾的行,并输出第4列 dfhawk{print根分区剩余容量是4}然后加常量输出 收集网卡流量信息 ifconfigeth0awkRXp{printeth0网卡接收的数量量是5} ifconfigeth0awkTXp{printeth0网卡发送的数量量是5} 四,awk的条件 1,字符串还可以使用正则包含!不包含 awkF:6root{print}user输出第6列包含root的行 awkF:6bin{print}user输出第6列包含bin的行 awkF:6!bin{print}user输出第6列不包含bin的行 2,使用数字或者字符串 ! awkF:33{print}user输出第3列小于3的行 awkF:33{print}user输出第3列小于等于3的行 awkF:NR2{print}user输出第2行 awkF:NR2{print}user输出行号大于2的行 3,逻辑组合并且或者 awkF:NR2NR4{print}user找行号是2或者4的行 awkF:NR2NR40{print}user如果只有一个条件满足就显示一个 awkF:7bash3500{print}user找第7列包含bash并且第3列 小于等于500的行 awkNR2NR4{print}user找行号既是2又是4的行,不存在,无输出 awkF:7bashNR3{print}user找第7列包含bash并且行号是13的 awkF:7bashNR3{print}user找第7列包含bash或者行号是13的 awkF:1rootuser找第1列包含root的行 如果有用户叫root6,也会搜到,比较宽松的搜索方式,如果 任务就是{print}的话可以省略不写 awkF:1rootuser找第1列完全等于root的行 多一个字符少一个字符都不行,比较严格的搜索方式 4,运算 awkNR20{printNR,0}user在条件中使用运算 ,找到将行号除以2余数等于0的行,然后输出该行的 行号和所有列,相当于输出偶数行 五,awk处理时机,可以执行额外任务 BEGIN任务执行1次,读取文档之前执行 逐行任务执行n次,读取文档时执行 END任务执行1次,读取文档之后执行 BEGIN{任务1}{任务2}END{任务3} awkF:BEGIN{printok}{print1}END{printok}user awkBEGIN{printNR}{printNR}END{printNR}user 利用awk处理时机,输出下列内容 awkBEGIN{printUserUIDHome}第1步输出表头信息 awkF:{print136}user第2步输出内容 awkEND{print总计NR行}user第3步输出结尾 awkF:BEGIN{printUserUIDHome}{print136}END{print总计NR行}user合在一起写 使用awk统计网站访问量 setenforce0关闭selinux systemctlstopfirewalld关闭防火墙 systemctlrestarthttpd开启网站服务 使用浏览器多访问几次网站,包括本机用curl curl192。168。4。7:82如果端口没改过就不用敲 awk{print1}varloghttpdaccesslog初步统计,不完美 六,使用awk数组for循环实现高级搜索 数组相当于可以存储多个值的特殊变量 数组名〔下标〕下标对应的值 awkBEGIN{a〔1〕10;a〔2〕20;printa〔2〕,a〔1〕}使用awk测试数组,首先 创建数组a,下标1对应值是10,下标2对应值是20,然后输出下标是2与 下标是1的值 awkBEGIN{a〔abc〕a〔xyz〕printa〔xyz〕}数组的下标 和值都可以不是数字,测试时加双引号即可 以上信息是手工输入,实际情况中通常是从文档收集 准备一个文档,里面有6行,每行分别是abc、xyz、abc、opq、xyz、abc然后 按照awk逐行处理的工作特点使用awk{a〔1〕}shu。txt走完每一行得到下列结果 但不会输出到屏幕 a〔1〕a〔abc〕a〔abc〕1 a〔1〕a〔xyz〕a〔xyz〕1 a〔1〕a〔abc〕a〔abc〕2 a〔1〕a〔opq〕a〔opq〕1 a〔1〕a〔xyz〕a〔xyz〕2 a〔1〕a〔abc〕a〔abc〕3 如果要输出到屏幕可以使用命令awk{a〔1〕}END{printa〔abc〕}shu。txt 根据上述操作得知使用数组可以收集信息,但收集完了之后查看确不方便,可以用for循环实现。方法如下: for(变量名in数组名){print变量名}这个格式可以查看数组的所有下标 awk{a〔1〕}END{for(iina){printi,a〔i〕}}shu。txt使用逐行任务与数组 收集文档shu。txt中的信息,然后在END任务中使用for循环显示所有 数组a的下标与值 awk{ip〔1〕}END{for(iinip){printi,ip〔i〕}}varloghttpdac cesslog将上述的文件替换成网站的日志,就可以 最终用来查看日志得到可以得到哪个ip来访以及来访的次数 awk{ip〔1〕}END{for(iinip){printi,ip〔i〕}}varloghttpdac cesslogsortnrk2使用sort命令增加排序 功能,n是以数字形式排序,r是降序,k是指定为 第几列排序 varlogsecure是安全日志,如果有人登陆时输入错误密码的话 信息会记录下来,这种信息可以用awk抓取出来,方法如下: awkFailedpasswordforroot{ip〔11〕}END{for(iinip){printi,ip〔i〕}} varlogsecure统计安全日志中访问root账户密码输入错误 的ip地址与次数 编写脚本,可以查看系统的各种参数信息 !binbash while: do clear freehawkMem:{print剩余内存容量是4} dfhawk{print根分区剩余容量是4} awkEND{print用户总数是NR个}etcpasswd whoawkEND{print登录用户数量是NR个} uptimeawk{printcpu的15分钟平均负载是NF} rpmqaawkEND{print安装的软件包数量是NR个} sleep3 done