zoukankan      html  css  js  c++  java
  • Linux 三剑客

    1、grep

    grep          过滤需要的内容
    -i            忽略大小写
    -o            显示匹配到的内容,其他不显示
    -v            排除内容
    -c            统计匹配行个数
    -n            显示匹配行及行号
    -E            扩展查找模式(相当于 egrep)
    -A            显示匹配行,并显示之后num行
    -w            按单词过滤,相当于
    grep stu –A 10 b.txt     过滤stu,显示改行之后的10行

    2、sed

    sed            流编辑器,实现对文件的增删改查
    选项:
    -n             屏蔽默认输出
    -i             直接修改源文件
    -e             可指定多个处理动作
    -r             支持扩展表达式
    {}             可组合多个命令,以;分隔
    -f             使用sed脚本
    
    定址符:
    p              打印行
    d              删除行
    s              字符串替换
    
    1              对第1行处理
    1,3            对第1到3行处理
    1,+3           对第1行后面3行处理
    1~2            对1,3,5,7……行处理
    1,$            对1行到最后1行处理
    /aa/,/bb/      对a行到b行处理
    /aaa/,9        对a行到第9行,若前9行没有,会显示后9行匹配的行
    
    查:
    sed –n ’20,30p’ b.txt         打印20到30行
    sed -n '3p;6p'  a.txt         打印第3和6行
    sed -n '3,+6p'  a.txt         打印第3行及其后6行
    sed -n '/^bin/p' a.txt        打印以bin开头的行
    sed -n 'p;n' a.txt            打印奇数行,n表示读下一行(隔行)
    sed -n 'n;p' a.txt            打印偶数行,n表示读下一行(隔行)
    sed -n '8,${n;p}' a.txt       打印8行到末尾所有的偶数行
    sed -n '$=' a.txt             打印文件的行数
    sed -n '/a/{=;p} ' b.txt      显示行号
    sed -n l aaa.jpg              打印不可见字符
    
    删除
    sed '3,5d' a.txt              删除第3到5行
    sed '/xml/d' a.txt            删除所有包含xml的行
    sed '/xml/!d' a.txt           删除不包含xml的行
    sed '/^xml/d' a.txt           删除以xml开头的行
    sed '$d' a.txt                删除最后1行
    sed '/^$/d' a.txt             删除所有空行
    sed '/^$/{n;/^$/d}' a.txt     删除重复空行,连续两个空行只保留一个
    sed -r'/a|b/d' a.txt          删除a或b的行
    sed '2,~2d' a.txt             删除2行到2的倍数行
    
    改    
    c    行替换
    s   字符串替换
    sed '2cxx' m.txt              第2行替换成xx
    sed '3,6cxx' m.txt            第3到6行替换成1行xx
    sed -n '2cxx
    yy' m.txt       第2行替换成xx并换行yy(
    换行符==强制换行)
    sed -e '3cxx' -e '6cxx' m.txt 第3行和第6行替换成xx
    sed 's#a#&s#g' a.txt          所有的a都替换成as,&代表查找串(类似{})
    sed 's#a##g' a.txt            删除所有行的a
    sed '4,7s/^/#/' a.txt         4到7行加#号
    sed '4,7s/^#//' a.txt         4到7行去掉#号
    sed 's/a/B/ig' a.txt          所有行的a替换成B(不区分大小写)
    
    增
    i    行前插入        
    a    行后插入
    sed '2ixx' m.txt              在第2行前插入行xx
    sed '3,6ixx' m.txt            在第3-6行每行前插入xx
    sed '2axx' m.txt              在第2行后插入xx
    sed '/^yy/axx' m.txt          在yy开头的行后插入xx
    
    () 后向引用
    把源数据保存起来,在替换的时再使用
    sed -r 's#(^.)#A1#' a.txt                       在行首添加A并输出
    sed -r 's#(^.)(.*)(.$)#1#' a.txt                输出1的数据
    sed -r 's#(^.)(.*)(.$)#321#' a.txt            321的数据
    ls *.bak |sed -r "s#(^.*)(.bak$)#mv & 1.txt#g"  把所有.bak改成.txt sed
    -nr 's#([^:]+)(:.*:)(/.*$)#321#gp' /etc/passwd (1和3对调) (:开头1次或多次的字符串)(从:到:所有的字符串)(以/结尾的字符串)& 保存替换时的源字符串
    stat /etc/hosts | sed -rn '/id/s#.*(([0-7]{3,}).*#1#p'
    取文件的权限, 匹配到( 0-7出现次数
    sed
    -n 's#20#&#gp' a.txt 替换文本内容&=保留源字符) sed 's/root/&admin/' a.txt 把root替换成rootadmin sed 's/[0-9]/(&)/g' a.txt 把数字用()括起来 sed –i.bak 's#a#&s#g' a.txt 修改源文件并备份 {} 命令组合键 sed -n '3{=;p}' b.txt 输出3行并显示行号(3=;3p) ! 取反 sed '1,3!d' a.txt 删除不是1到3行 sed '/a/!d' a.txt 删除不是a的行 sed '1~2d' a.txt 删除奇数行(模式空间够2行,删1行) sed '1~2!d' a.txt 删除偶数行 n 把当前行的下一行读取到模式空间 sed -n 'p;n' a.txt 打印奇数行,n表示读下一行(隔行) sed -n 'n;p' a.txt 打印偶数行,n表示读下一行(隔行) 文件操作 r 读取文件 --r动作应结合 -i 选项才会存入,否则只输出 w 保存到文件 --w动作以覆盖的方式另存为新文件 sed -i 'r a.txt' b.txt 把a导入到b(b.txt要存在) sed -i '2r a.txt' b.txt 把a导入到b的第2行下方 sed 'w c.txt' b.txt 把b另存为c(c不用存在) sed '/^x/w c.txt' b.txt 把b以x开头的行存为c -H 模式空间---追加----保持空间--复制 -h 模式空间---覆盖----保持空间--复制 -G 保持空间---追加----模式空间--剪切 -g 保持空间---覆盖----模式空间--剪切 sed '1h;2H;$G' b.txt 把文件的前2行复制到文件的末尾 sed '1h;2H;1,2d;$G' b.txt 把文件的前2行剪切到文件的末尾

     3、awk

    1、常用命令选项
    -F            指定分隔符,默认空格或Tab键
    -f            调用awk脚本
    -v            调用外部shell变量
    
    2、awk内置变量
    $1..$n        指定分隔符号对应的值
    $0            当前行的内容
    $NF           最后一列
    NF            指定分隔符号后,行的列数
    NR            当前行的行号
    FS            保存或设置字段分隔符
    FNR           保存当前文件的行数
    FILENAME      保存当前的文件名
    ENVIRON       调用shell环境变量
    awk '{ print $0  }' a.txt               #打印文件所有内容
    awk '{print $1,$2}' a.txt               #打印分隔符列1和2内容
    awk -F ":"'{print $1}' a.txt            #指定分隔符并打印列1内容
    awk -F '[:/]' '{print $1}' a.txt        #指定分隔符:或/并打印列1内容
    awk –F '[ :]+' '{print $3,$6}’ a.txt    #分割空格和冒号
    awk -F : '{print NF,NR}' a.txt          #指定分隔符并打印行号和列数
    
    3、awk自定义变量
    echo 111 | awk '{a=10;b="jim";print a,b}'
    x=100;echo 111 | awk -v a=$x '{print a}'
    
    4、awk调用shell系统环境变量
    ENVIRON (数组类型的内置变量)
    ENVIRON["系统环境变量名"]
    echo 111 | awk '{print ENVIRON["USER"]}'
    
    5、awk处理数据的顺序
    行前处理 BEGIN{   } 
    逐行处理 {    }                  
    行后处理 END{     }       
    awk 'BEGIN{x=0}/bash/{x++} END{print x}' /etc/passwd      #统计使用bash的用户个数
    head  /etc/passwd|awk -F ":" '{print $1"	",$3,"	"$6}'|sed '1i用户名 uid 家目录'
    head  /etc/passwd|awk 'BEGIN{FS=":";print "用户名	uid	家目录"}{print $1"	",$3"	",$6}'
    
    6、正则表达式
    /正则/        匹配正则(行)
    ~/正则/       匹配正则(列)
    !~/正则/      不匹配
    awk  '$0 ~ /root/{print $0}'  /etc/passwd 
    awk  '$0 !~ /root/{print $0}'  /etc/passwd 
    awk -F ":" '/^ro/{print}' /etc/passwd
    awk -F ":" '$1 ~ /[0-9]/{print $1,$6}' /etc/passwd
    
    7、数值比较  
    awk -F ":" '$3 == 0 {print $0}' /etc/passwd
    awk -F ":" '$3 != 0 {print $0}' /etc/passwd
    awk -F ":" '$1 == "root" {print $0}'  /etc/passwd
    
    8、逻辑比较(多个条件)
    逻辑与 &&  多个条件同时成立
    逻辑或 ||  多个条件有一个成立
    逻辑非 !   取反
    awk  -F  ":"  '$7=="/bin/bash" && $3<500{print $0}' /etc/passwd
    awk  -F  ":"  '$7=="/bin/bash" || $3<500{print $0}' /etc/passwd
    
    9、awk运算符号
    三元运算符的形式:[结果=条件? 结果1:结果2]或 [条件?表达式1:表达式2]
    awk 'BEGIN{a="b";print a=="c"?"ok":"err"}'                       #三元运算符
    awk  'FNR%2 == 0 {print FNR,$0}' /etc/passwd                     #输出文件中的偶数行
    awk  'FNR%2 != 0 {print FNR,$0}' /etc/passwd                     #输出文件中的奇数行
    awk -F ":" '$3<500 {i++}END{print i}' /etc/passwd                #统计uid号小于500的用户个数
    awk -F ":" '$3>=500 {i++}END{print i}' /etc/passwd               #统计普通用户的个数
    awk -F ":" '$7=="/sbin/nologin"{i++}END{print i}' /etc/passwd    #统计有多少用户不能登录系统
    seq 1 10 | awk  '$0%2 == 0 {print $0;i++}END{print i}'           #输出1到10之间的偶数,并统计偶数的个数
    seq 1 10 | awk  '$0%7 == 0 || $0 ~ /7/{print $0}'                #输出1到10之间,7倍数或含7的数
    
    10、awk流程控制
    单分支     if (条件表达式) {  动作  }
    awk -F ":" '{ if($3<500)i++ } END{print i}'  /etc/passwd
    双分支     if (条件表达式) {  动作  } else { 动作 }
    awk -F ":" '{ if($3<500){i++}else{j++} }END{print i,j}'  /etc/passwd
    多分支     if( 条件1 ){ 指令 } else if( 条件2 ){指令} else{指令N}
    awk -F ":" '{if ($7=="/bin/bash"){i++}else if($7=="/sbin/nologin"){j++}else{z++}}END{print i,j,z}' /etc/passwd 
    
    11、for循环结构
    for( 赋初值;条件;步长 ){ 循环体 }
    break          #结束当前的循环体
    continue       #中止本次循环,开始下一次循环
    next           #跳过当前行,读入下一行文本开始处理
    exit           #结束文本读入,转到END{}执行,没有END,直接退出awk
    awk 'BEGIN{for(i=1;i<=5;i++){print i} }'
    awk 'BEGIN{for(i=1;i<=5;i++){ip[i]="1.1.1."i};for(x=1;x<=5;x++){print ip[x]}}'
    awk 'BEGIN{for(x=1;x<=5;x++){if(x==3){continue};print x}}'
    awk 'FNR==3{exit}{print FNR,$0}' a.txt
    awk -F ":" '$1~/a/{next}{print FNR,$1}' /etc/passwd
    awk 'NF<2{next}{print}' a.txt                   #输出2列以上的行,跳过空行及1列的行
    
    12、while循环结构
    while (条件判断){  循环体  }
    do { 循环体  }while(条件判断),先循环再判断条件,无论条件是否成立,都会循环一次
    awk 'BEGIN{i=1;while(i<=5){print "a"i;i++} }'
    awk 'BEGIN{do { print "a "x" b";x++}while(x<=5)}'
    awk 'BEGIN{x=1; do{print "a "x" b";x++}while(x<=5)} '
    awk 'BEGIN{x=1;while(x<=5){if(x==3){break};print x;x++}}'
    awk 'BEGIN{x=1;while(x<=5){if(x==3){x++;continue};print x;x++}}'
    
    13、awk数组
    awk 'BEGIN{a[0]="jim";a[1]=29;print a[0],a[1]}'
    head /etc/passwd | awk -F ":" '{a[FNR]=$1;print a[FNR]}'
    awk '{a[i]++ }END{print a[i] }'  /etc/passwd
    awk 'BEGIN{ for(i=1;i<=3;i++){a[i]="8"i;print a[i]}}'
    awk -F ":" '$3<=2{a[$1]=$3}END{print a["root"]}' /etc/passwd
    awk -F ":" '{a[$3]=$1}END{for(i=0;i<=3;i++){print i,a[i]}}' /etc/passwd(有序)
    awk -F ":" 'NR<=3{a[$1]=$3}END{for(i in a){print i,a[i]}}' /etc/passwd (无序)
    awk '!a[$0]++'  /etc/passwd (去除重复行)
    awk数组下标默认从1开始,元素的值可以是"空字符串"
    
    14、awk应用
    1)统计访问网站服务器的IP和次数
    awk '{ip[$1]++}END{for(i in ip){print i,ip[i]}}'  access_log
    2)统计日志中访问最多的10个IP
    awk '{a[$1]++}END{for(i in a)print a[i],i|"sort -k1 -nr|head -n10"}' access.log
    awk '{print $1}' access.log |sort |uniq -c |sort -k1 -nr |head -n10
    3)统计日志中访问大于100次的IP
    awk '{a[$1]++}END{for(i in a){if(a[i]>100)print i,a[i]}}' access.log
    4)统计2016年4月9日一天内访问最多的10个IP
    awk '$4>="00:00:01" && $4<="23:59:59" {a[$1]++}END{for(i in a)print a[i],i}' access.log |sort -r|head -10
    sed
    -n '/00:00:01/,/23:59:59/p' access.log| awk '{print $1}' |sort |uniq -c |sort -r |head -10 5)统计当前时间前一分钟的访问数 day=$(date -d '-1 minute' +%H:%M);awk -va=$day '$0~a{c++}END{print a,c}' access.log grep -c $(date -d '-1 minute' +%H:%M) access.log 6)统计每个URL访问内容的总大小($body_bytes_sent) awk '{a[$7]++;size[$7]+=$10}END{for(i in a)print a[i],size[i],i}' access.log 7)统计每个IP访问状态码数量 awk '{a[$1" "$9]++}END{for(i in a)print i,a[i]}' access.log 8)统计访问状态码为404的IP及出现次数 awk '{if($9~/404/)a[$1" "$9]++}END{for(i in a)print i,a[i]}' access.log 9)统计下面文件里单词出现的次数并排序 sed -r 's#[^a-Z]+# #g' /etc/passwd > /tmp/tongji.txt 创建文件 sed 's# # #g' tongji.txt|sort |uniq -c tr " " " " < tongji.txt|sort |uniq -c egrep -o "[a-z0-9]+" tongji.txt|sort |uniq -c xargs -n1 <tongji.txt|sort |uniq -c awk 'BEGIN{RS=" "}{print $0}' tongji.txt|sort |uniq -c 10)显示行号 cat -n tongji.txt (包括空行) cat -b tongji.txt (不包括空行) nl -ba tongji.txt (包括空行) nl -bt tongji.txt (不包括空行) grep -n "." tongji.txt (包括空行不显示) grep -n ".*" tongji.txt (包括空行并显示) sed -n '=;p' tongji.txt (包括空行) awk '{print NR":"$0}' tongji.txt (包括空行) wc -l tongji.txt (包括空行) less -N tongji.txt (包括空行)

     

  • 相关阅读:
    pyqt5开发之俄罗斯方块
    Tkenter之API测试系统界面设计
    Python的标准GUI:Tkinter的组件
    Python单元测试框架——unittest
    【Android】自定义ListView的Adapter报空指针异常解决方法
    5、使用Libgdx设计一个简单的游戏------雨滴
    4.6、Libgdx线程介绍
    4.5、Libgdx运行日志管理
    4.4、Libgdx使用方法查询运行环境相关属性
    4.3、Libgdx启动类和配置
  • 原文地址:https://www.cnblogs.com/wuhg/p/12583733.html
Copyright © 2011-2022 走看看