• 三剑客(一)


    awk实例

    Awk变量

    1.$0保存当前记录的内容
    # awk '{print $0}' /etc/passwd
    2.NR记录输入总的编号(行号) # awk '{print NR,$0}' /etc/passwd # awk 'NR<=3' /etc/passwd
    3.FNR当前输入文件的编号(行号) # awk '{print NR,$0}' /etc/passwd /etc/hosts # awk '{print FNR,$0}' /etc/passwd /etc/hosts
    4.NF保存行的最后一列 # awk -F ":" '{print NF,$NF}' /etc/passwd /etc/hosts
    5.FS指定字段分割符, 默认是空格 以冒号作为字段分隔符 # awk -F: '/root/{print $1,$3}' /etc/passwd# awk 'BEGIN{FS=":"} {print $1,$3}' /etc/passwd 以空格冒号tab作为字段分割 # awk -F'[ : ]' '{print $1,$2,$3}' /etc/passwd
    6.OFS指定输出字段分隔符 ,逗号映射为OFS, 初始情况下OFS变量是空格 # awk -F: '/root/{print $1,$2,$3,$4}' /etc/passwd# awk 'BEGIN{FS=":"; OFS="+++"} /^root/{print $1,$2}' /etc/passwd
    7.RS输入记录分隔符,默认为换行符[了解] # awk -F: 'BEGIN{RS=" "} {print $0}' /etc/hosts
    8.ORS将文件以空格为分割每一行合并为一行[了解] # awk -F: 'BEGIN{ORS=" "} {print $0}' /etc/hosts
    9.printf格式化输出函数 # awk -F: '{print "用户是:" $1 " 用户uid: " $3 " 用户gid:" $4}' /etc/passwd printf 函数 # awk -F: '{printf "%-15s %-10s %-15s ", $1, $2, $3}' /etc/passwd %s 字符类型 %d 数值类型 占 15 字符 - 表示左对齐,默认是右对齐 printf 默认不会在行尾自动换行,加

    Awk模式动作

    1.正则表达式
    匹配记录(整行)
    # awk '/^root/' /etc/passwd
    # awk '$0 ~ /^root/' /etc/passwd 匹配字段:匹配操作符(~ !~) # awk '$1~/^root/' /etc/passwd
    # awk '$NF !~ /bash$/' /etc/passwd
    2.比较表达式 关系运算符 运算符 含义 示例 < 小于 x<y <= 小于或等于 x<=y == 等于 x==y != 不等于 x!=y >= 大于等于 x>=y > 大于 x>y uid为0的列出来 # awk -F ":" '$3==0' /etc/passwd uid小于10的全部列出来 # awk -F: '$3 < 10' /etc/passwd 用户登陆的shell等于/bin/bash # awk -F: '$7 == "/bin/bash" ' /etc/passwd 第一列为alice的列出来 # awk -F: '$1 == "alice" ' /etc/passwd 为alice的用户列出来 # awk -F: '$1 ~ /alice/ ' /etc/passwd
    # awk -F: '$1 !~ /alice/ ' /etc/passwd 磁盘使用率大于多少则,则打印可用的值 # df |awk '//$/'|awk '$3>1000000 {print $4}'
    3.条件表达式 # awk -F: '$3>300 {print $0}' /etc/passwd
    # awk -F: '{if($3>300) print $0}' /etc/passwd
    # awk -F: '{if($3>5555){print $3} else {print $1}}' /etc/passwd
    4.运算表达式 # awk -F: '$3 * 10 > 500000' /etc/passwd
    # awk -F: 'BEGIN{OFS="--"} { if($3*10>50000) {print $1,$3} } END {print "打印ok"}' /etc/passwd
    # awk '/southem/{print $5 + 10}' datafile # awk '/southem/{print $5 + 10.56}' datafile # awk '/southem/{print $8 - 10}' datafile # awk '/southem/{print $8 / 2 }' datafile # awk '/southem/{print $8 * 2 }' datafile # awk '/southem/{print $8 % 2 }' datafile
    5.逻辑操作符和复合模式 &&逻辑与 || 逻辑或 !逻辑非 匹配用户名为root并且打印uid小于15的行 # awk -F: '$1~/root/ && $3<=15' /etc/passwd 匹配用户名为root或uid大于5000 # awk -F: '$1~/root/ || $3>=5000' /etc/passwd
    6.awk示例1 # awk '/west/' datafile # awk '/^north/' datafile # awk '$3 ~ /^north/' datafile # awk '/^(no|so)/' datafile # awk '{print $3,$2}' datafile # awk '{print $3 $2}' datafile # awk '{print $0}' datafile # awk '{print "Number of fields: "NF}' datafile # awk '/northeast/{print $3,$2}' datafile # awk '/^[ns]/{print $1}' datafile # awk '$5 ~ /. [7-9]+/' datafile # awk '$2 !~ /E/{print $1,$2}' datafile # awk '$3 ~ /^Joel/{print $3 "is a nice boy."}' datafile # awk '$8 ~ /[0-9][0-9]$/{print $8}' datafile # awk '$4 ~ /Chin$/{print "The price is $" $8 "."}' datafile # awk '/Tj/{print $0}' datafile # awk -F: '{print "Number of fields: "NF}' /etc/passwd # awk -F"[ :]" '{print NF}' /etc/passwd
    7.awk示例2 # cat b.txt bgx xuliangwei:is a:good boy!
    # awk '{print NF}' b.txt # awk -F ':' '{print NF}' b.txt # awk -F"[ :]" '{print NF}' b.txt

    Awk条件判断

    1.单分支
    if语句格式:{
    if(表达式){语句;语句;... }} 打印当前管理员用户名称 # awk -F: '{ if($3==0){print $1 "is adminisitrator"} }' /etc/passwd 统计系统用户数量 # awk -F: '{ if($3>0 && $3<1000){i++}} END {print i}' /etc/passwd 统计普通用户数量 # awk -F: '{ if($3>1000){i++}} END {print i}' /etc/passwd
    2.双分支
    if
    ...else 语句格式: {if(表达式){语句;语句;... }else{语句;语句;...}} # awk -F: '{if($3==0){print $1} else {print $7}}' /etc/passwd # awk -F: '{if($3==0) {count++} else{i++} }' /etc/passwd # awk -F: '{if($3==0){count++} else{i++}} END{print " 管理员个数: "count ; print " 系统用户数: "i}' /etc/passwd
    3、多分支
    if...else if...else 语句格式: # awk -F: '{ if($3==0){i++} else if($3>0 && $3<1000){j++} else if($3>1000) {k++}} END {print i;print j;print k}' /etc/passwd
    # awk -F: '{ if($3==0){i++} else if($3>0 && $3<500){j++} else if($3>=500) {k++}} END {print "管理员",i;print "系统用户",j;print "普通用户",k }' /etc/passwd

    Awk循环语句

    1.while循环
    # awk 'BEGIN{ i=1; while(i<=10){print i; i++} }'
    # awk -F: '{i=1; while(i<=NF){print $i; i++}}' /etc/passwd
    # awk -F: '{i=1; while(i<=10) {print $0; i++}}' /etc/passwd
    2.for循环 C 风格
    for # awk 'BEGIN{for(i=1;i<=5;i++){print i} }' 将每行打印 10 次 # awk -F: '{ for(i=1;i<=10;i++) {print $0} }' passwd
    # awk -F: '{ for(i=1;i<=NF;i++) {print $i} }' passwd

     2、sed流编辑器

    sed 工作流程

    【sed循环的工作过程】:
    1. 读取输入流的一行到模式空间
    2. 对模式空间中的内容进行匹配和处理
    3. 自动输出模式空间内容
    4. 清空模式空间内容
    5. 读取输入流的下一行到模式空间
    sed -ri.bak
    sed -ric --follow-symlinks  

    sed 常用选项

    -n:取消默认输出,只显示处理的行-e:执行多个sed指令-f:执行sed文件
    -i:直接对内容进行修改-r:支持正则匹配

    sed 命令

    a:追加行,多行用""
    i:插入行,多行用""
    c:更改行,多行用""
    d:删除
    p:打印,一般和-n一起用
    n:下一行
    r:读取文件
    w:写入文件
    !:取反
    s:替换
    =:行号
    l:列出特殊字符
    q:退出sed
    
    ================暂存缓冲区================
    
    h:把模式空间里的内容复制到暂存缓冲区(覆盖)
    H:把模式空间里的内容追加到暂存缓冲区
    g:取出暂存缓冲区的内容,将其复制到模式空间,覆盖该处原有内容
    G:取出暂存缓冲区的内容,将其复制到模式空间,追加在原有内容后面
    x:交换暂存缓冲区与模式空间的内容  
    
    ====================s替换====================
    s 替换标志
    g 全局替换
    i 忽略大小写
    r 从文件中读
    w 将行写入文件
    y 将字符转换为另一字符(不支持正则表达式) 
    
     实例1
    1.追加命令【a】
    # sed '3ahello' test_passwd                 #3行追加 hello
    # sed '/lp/ahello' test_passwd              #匹配行追加 hello
    # sed '$ahello' test_passwd                 #最后一行追加 hello
    
    2.插入命令【i】
    # sed '3ihello' test_passwd                 #3行前插入hello
    # sed '/root/ihello' test_passwd            #匹配行前追加 hello
    # sed '$ihello' test_passwd                 #最后一行前插入hello
    
    3.修改命令【c】
    # sed '3chello' test_passwd                 #3行修改hello
    # sed '/root/chello' test_passwd            #匹配行修改 hello
    # sed '$chello' test_passwd                 #最后一行修改hello
    
    4.删除命令【d】
    # sed '4d' test_passwd                      #删除第4行
    # sed '1~2d' test_passwd                    #第1行开始删除,每隔2行就删一行,即删除奇数行
    # sed '1,2d' test_passwd                    #删除第1~2行
    # sed '1,2!d' test_passwd                   #删除1~2之外的所有行
    # sed '$d' test_passwd                      #删除最后1行
    # sed '/root/d' test_passwd                 #删除包含root的行
    # sed '/lp/,$d' test_passwd                 #删除从包含lp的行到最后1行
    # sed '/lp/,+1d' test_passwd                #删除匹配lp的行及其后面一行
    # sed '/^$/d' test_passwd                   #删除空行
    # sed -r '/root|halt/d' test_passwd         #删除匹配root或halt的行
    # sed -r '/root|halt/!d' test_passwd        #删除不匹配root或halt的行
    # sed '1,3{/^bin/d}' test_passwd            #删除1~3行中,以bin开头的行
    # sed '1~2d' /etc/passwd                    #删除所有奇数行
    # sed '0~2d' /etc/passwd                    #删除所有偶数行
    
    5.打印命令【p】
    # sed '' test_passwd                        #默认是打印输出
    # sed -n '1,3p' test_passwd                 #打印第1-3行
    # sed -n '3,5!p' test_passwd                #打印3~5行,以外的内容
    # sed -n '1~2p' test_passwd                 #打印奇数行,1行起,每隔两行
    # sed -ns '$p' test_passwd  a.txt           #打印最后一行,多个文件用-s选项
    # sed -n '3,+4p' test_passwd                #打印3行到后面的4行
    # sed -n '3,~4p' test_passwd                #打印3行到4的倍数行
    6.获取下一行命令【n】 # sed -n '/lp/{n;p}' test_passwd #打印匹配行的下一行 # sed '/lp/{n;d}' test_passwd #删除匹配行的下一行 # sed -n '/rw/{n;s/a/b/;p}' test_passwd #匹配行的下一行a替换成b 7.读文件命令【r】 # sed '3r /etc/hosts' test_passwd #从文件/etc/hosts读取内容,追加到第3行 # sed '/abc/r /etc/hosts' test_passwd #从文件/etc/hosts读取内容,追加到匹配行 8.写文件命令【w】 # sed -n '5,$w /etc/hosts' test_passwd #5到最后一行,写入到/etc/hosts(覆盖方式) # sed -n '5w,$w /etc/hosts' test_passwd #5和最后一行,写入到/etc/hosts(覆盖方式) 9.替换命令【s】 # sed 's/root/mike/' test_passwd #替换一个 # sed 's/root/mike/g' test_passwd #全部替换 # sed 's/ROOT/mike/gi' test_passwd #不区分大小写 # sed 's/root/abc/gw 1.txt' test_passwd #替换并写入到文件 # sed -r 's/(.*)/&YYY/' test_passwd #每行末尾添加YYY # sed 's/[0-9]/(&)/g' test_passwd #每行的数字加小括号 # sed -r 's/([0-9])/(1)/g' test_passwd #每行的数字加小括号 10.打印行号【=】 # sed -n "=" test_passwd #打印行号 # sed -n "$=" test_passwd #最后一行的行号 # sed -n "/root/=" test_passwd #匹配行的行号 # sed -n "/root/{=;p}" test_passwd #匹配行的行号及内容 11.退出命令【q】 # sed "/^bin/q" test_passwd #遇到以bin开头的行,退出sed 12.列出非打印字符【l】 # sed -n "/root/l" test_passwd #列出特殊字符

     sed 暂存空间与模式空间(暂存空间默认有一行换行符

     

    sed的数据 模式空间(文件行的内容)  保持空间(默认是换行符)
    # sed  'g' test_passwd                  #把保持空间换行符覆盖到模式空间,每行都是换行符
    # sed  'G' test_passwd                  #把保持空间换行符追加到模式空间,数据+换行符
    # sed  'h;g' test_passwd                #把模式空间的内容覆盖到保持空间,再把保持空间覆盖到模式空间,数据没有变化
    # sed  'h;G' test_passwd                #把模式空间的内容覆盖到保持空间,再把保持空间追加到模式空间,2倍数据
    # sed  'H;g' test_passwd                #把模式空间的内容追加到保持空间,再把保持空间覆盖到模式空间,以行为单位,换行符+1行,换行符+2行(覆盖)
    # sed  'H;G' test_passwd                #把模式空间的内容追加到保持空间,再把保持空间追加到模式空间,以行为单位,换行符+1行,换行符+2行(追加到每行后面)
    # sed  '1h;$G' /etc/hosts               #把1行追加最后1行
    # sed  '1{h;d};$G' /etc/hosts           #把1行追加最后1行并删除
    # sed  '1h; 2,$g' /etc/hosts            #把1行追加最后2行到最后一行
    # sed  '1h; 2,3H; $G' /etc/hosts        #把1行,2到3行,追加最后一行
    # sed  '1h; 2x; $G' test_passwd         #把1行复制,2行交换数据,保持空间追加最后一行
    # sed '1x;$g' #把1行交换,保持空间追加最后一行
    # sed  '1!G; $!h; $!d' #不是1行的追加,不是最后一行的覆盖,不是最后一行的删除
     实例2
    1.反向选择【!】
    # sed '3d' test_passwd                              #删除第3行    
    # sed '3!d' test_passwd                             #只留第3行
    
    2.多重编辑【; {}】
    # sed -e '1,3d' -e 's/root/tom/' test.txt    
    # sed '1,3d; s/root/tom/' test.txt                  #先删除1到3行,然后替换
    # sed '2s/abc/123/g; 2s/tom/root/g' test.txt        #多个替换
    # sed '2{s/abc/123/g; s/tom/root/g}' test.txt
    
    3.使用外部变量
    # sed "3a$abc" /etc/hosts                           #3行追加变量的值
    # sed '$a'"$abc" /etc/hosts                         #最后一行追加变量的值
    # sed 3a$abc /etc/hosts
    # sed "$a$abc" /etc/hosts                          #$要转义

                        

                      

  • 相关阅读:
    Tomcat 结合Atomikos 实现JTA
    [译]Kinect for Windows SDK开发入门(十一):手势识别 下:基本手势识别
    [译]Kinect for Windows SDK开发入门(十二):语音识别 上
    [译]Kinect for Windows SDK开发入门(十):手势识别 上:基本概念
    [译]Kinect for Windows SDK开发入门(十五):进阶指引 下
    [译]Kinect for Windows SDK开发入门(九):骨骼追踪进阶 下
    [译]Kinect for Windows SDK开发入门(十四):进阶指引 上
    [译]Kinect for Windows SDK开发入门(八):骨骼追踪进阶 上
    [译]Kinect for Windows SDK开发入门(十三):语音识别 下
    Codeforces Round #757 (Div. 2) A D
  • 原文地址:https://www.cnblogs.com/wuhg/p/13427136.html
Copyright © 2020-2023  润新知