zoukankan      html  css  js  c++  java
  • 三剑客(一)

    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                          #$要转义

                        

                      

  • 相关阅读:
    Leetcode Binary Tree Preorder Traversal
    Leetcode Minimum Depth of Binary Tree
    Leetcode 148. Sort List
    Leetcode 61. Rotate List
    Leetcode 86. Partition List
    Leetcode 21. Merge Two Sorted Lists
    Leetcode 143. Reorder List
    J2EE项目应用开发过程中的易错点
    JNDI初认识
    奔腾的代码
  • 原文地址:https://www.cnblogs.com/wuhg/p/13427136.html
Copyright © 2011-2022 走看看