码迷,mamicode.com
首页 > 其他好文 > 详细

文本文件查找,正则 sed awk

时间:2015-02-28 18:53:41      阅读:173      评论:0      收藏:0      [点我收藏+]

标签:linux bash 文本文件查找   正则2 sed awk   

二.  sed

格式 :   sed ‘内容‘p -n 文件   打印某行  内容为英文用 / /括起来

          sed ‘内容‘d  文件   打印除内容以外其他行

sed    不加-i 进行查看    加上-i  对源文件进行操作
             -r 不需要脱义  ? + ( ) | 需要脱义
          
打印指定行 sed ‘10‘p -n 1.txt;
        不加-n 会每行出现2次,打印第10行
            sed ‘1,4‘p -n 1.txt;
                  1到4行
            sed ‘5,$‘p -n 1.txt
               5到末行

p为打印,d为删除
-n 静默模式,和p一起用。(只打印符合条件的行)
     sed -n ‘/^\//p‘ /etc/fstab
a \字符串:在指定行后面追加新行
     \n 可以换行
i \字符串:在指定行前面加新行


r 路径  指定的文件添加到查找到的行出

     sed ‘1,3r /etc/passwd‘ /etc/fstab

用于文件合并


w 路径 将查找内容写入指定文件路径下

 sed ‘1,5w /etc/123.txt‘ /etc/fstab


s/被查找内容/替换内容/  默认替换是每行第一个

     g:全局替换

     i:忽略大小写

s/// s### s@@@


live-->liver

love-->lover

s/l..e/&r/g     被查找内容支持正则,但是替换内容不支持,只能用 & 代替前面查找的内容,后面加个r


s#\(l..e\)#\1r#g   后项引用


live-->Live

love-->Love

s#l\(..e\)#L\1#g   只能使用后项引用


sed -f /xssh/1.sh  /etc/fstab
使用 shell文件 执行文件

sed -r 
使用扩展正则

history |sed ‘s#^[[:space:]]##g‘ | cut -d ‘  ‘ -f1
将行首空白砍掉


/内部如果有字符与格式脱意冲突 需要 "\"/

打印包含某个字符串的行 sed -n ‘/root/‘p 1.txt
                        包含root的行

可以使用 ^ . * $等特殊符号-e 可以实现同时进行多个任务
   sed -e ‘/root/p‘ -e ‘/body/p‘ -n 1.txt 也可以用;实现
 
sed  ‘/root/p; /body/p‘ -n 1.txt

删除行 sed ‘/root/d‘ 1.txt;
           删除带有root的行 ,不需要带 -n
        sed ‘1d‘ 1.txt;
        删第一行
       sed ‘1,10d‘ 1.txt
         删1到10行

替换 sed ‘1,2s/ot/to/g‘ 1.txt,
         1、2行 ot 改为 to 
其中s就是替换的意思,g为全局替换,否则只替换第一次的,
/也可以为 #, @ 等
         sed ‘s/BASH/123/gi‘ 1.log            
替换时候 加i  不区分大小写
  
删除所有数字 sed ‘s/[0-9]//g‘ 1.txt
删除所有非数字  sed ‘s/[^0-9]//g‘ 1.txt

head -n2 1.txt |sed ‘s/\(root\)\(.*\)\(bash\)/\3\2\1/‘
调换两个字符串位置
                sed -r ‘s/(^.*)(:.*:)(\/.*$)/\3\2\1/g‘
                sed -r ‘s#(^.#)(:.*:)(/.*$)#\3\2\1#‘

直接修改文件内容 sed -i ‘s/ot/to/g‘ 1.txt



sed练习题:
把/etc/passwd 复制到/root/test.txt,用sed打印所有行

sed -n ‘1,$p‘ test.txt
打印test.txt的3到10行

sed -n ‘3,10p‘ test.txt
打印test.txt 中包含 ‘root‘ 的行

sed ‘/root/p‘  -n test.txt
删除test.txt 的15行以及以后所有行

sed ‘15,$d‘ test.txt
删除test.txt中包含 ‘bash‘ 的行

sed ‘/bash/d‘ test.txt
替换test.txt 中 ‘root‘ 为 ‘toor‘

sed ‘s#root#toor#g‘  test.txt
替换test.txt中 ‘/sbin/nologin‘ 为 ‘/bin/login‘

sed ‘s#/sbin/nologin#/bin/login#g‘  test.txt
删除test.txt中5到10行中所有的数字

sed ‘5,10s#[0-9]##g‘ test.txt
删除test.txt 中所有特殊字符(除了数字以及大小写字母)

sed ‘s#[^0-9a-z]##g‘ 123
把test.txt中第一个单词和最后一个单词调换位置

sed -r ‘s#(^.*)(:.*:.*:.*:.*:.*:.*/.*/)(.*$)#\3\2\1#g‘ test.txt

               bash:x:0:0:root:/root:/bin/root  (最后一个单词与第一个调换)

sed -r ‘s#(^.*)(:.*:.*:.*:.*:.*:.*)(/.*/.*$)#\3\2\1#g‘ test.txt

               /bin/bash:x:0:0:root:/root:root  (最后的shell 与第一个单词调换)

sed ‘s#\(^.*\)\(:x:.*\)\(/.*$\)#\3\2\1#g‘ test.txt   (使用脱意)     -r 可以 省去脱意字符

               

把test.txt中出现的第一个数字和最后一个单词替换位置

sed -r ‘s#(^.*)([0-9])(.*/.*/.*/)(.*$)#\1\4\3\2#g‘ test.txt

sed -r ‘s#(^.*)([0-9])(.*/.*/.*/)(.*$)#\1\4\3\2#g‘ test.txt


把test.txt 中第一个数字移动到行末尾

sed -r ‘s#(^.*:)([0-9])(.*$)()#\1\4\3\2#g‘ 123
在test.txt 20行到末行最前面加 ‘aaa:‘

sed ‘20s/$/aaa/g‘  123




AWK



截取文档中的某段 awk -F ‘:‘ ‘{print $1}‘ 1.txt
也可以使用自定义字符连接每个段 awk -F‘:‘ ‘{print $1"#"$2"#"$3"#"$4}‘ 1.txt
匹配字符或字符串 awk ‘/oo/‘ 1.txt
针对某个段匹配 awk -F ‘:‘ ‘$1 ~/oo/‘ 1.txt
多次匹配 awk -F ‘:‘ ‘/root/ {print $1,$3}; $1 ~/test/; $3 ~/20/‘ 1.txt
条件操作符==, >,<,!=,>=;<=
awk -F ‘:‘ ‘$3=="0"‘  1.txt;
awk -F ‘:‘ ‘$3>="500"‘ 1.txt;
awk -F ‘:‘ ‘$7!="/sbin/nologin"‘  1.txt;
awk -F ‘:‘ ‘$3<$4‘ 1.txt ;
awk -F ‘:‘ ‘$3>"5" && $3<"7"‘ 1.txt
awk -F ‘:‘ ‘$3>"5" || $7=="/bin/bash"‘ 1.txt
awk内置变量 NF(段数)  NR(行数)
head -n3 1.txt | awk -F ‘:‘ ‘{print NF}‘
head -n3 1.txt | awk -F ‘:‘ ‘{print $NF}‘
head -n3 1.txt | awk -F ‘:‘ ‘{print NR}‘
打印20行以后的行awk ‘NR>20‘ 1.txt
awk -F ‘:‘ ‘NR>20 && $1 ~ /ssh/‘  1.txt
更改某个段的值awk -F ‘:‘ ‘$1="root"‘ 1.txt
数学计算, 把第三段和第四段值相加,并赋予第七段 awk -F ‘:‘ ‘{$7=$3+$4; print $0}‘ 1.txt
计算第三段的总和 awk -F ‘:‘ ‘{(tot=tot+$3)}; END {print tot}‘ 1.txt
awk中也可以使用if关键词 awk -F ‘:‘ ‘{if ($1=="root") print $0}‘ 1.txt



awk -F ‘:’ ‘{print $1}‘ 1.log
按 : 分割  显示 第一列
              print $0 
   显示所有

awk -F ‘:’  ‘$1~/root/‘ 1.log
  第一列  匹配 root  显示所有列

{print NR}
显示个别列  NR为显示 行号


awk -F ‘:‘ ‘$3==0‘ 1.log
匹配第三段 是0的

>=  大于 等于
!=  不等于
$3<$4  符合这个比较项的
$3==$4  需要2个等号 
1个等号 是赋值

$3==$4 && &1==$2    && 并且~

awk -F ‘:‘ ‘{print $NF}‘ 1.log
       此时 NF 等于7

          ‘NR>20 && $NF !="/sbin/nologin" ‘
          20行以后  并且 7列不等于

awk -F ‘:‘ ‘{(tot=tot+$3)}; END{print tot}‘ 1.log
          将第三列 连续相加

awk -F ‘:‘ ‘{(if $1=="root") print $0}‘ 1.log
   第一列 为 root  的行

awk -F ‘:‘  ‘$7=$3+$4‘ 1.log
    第7列 等于  3  4 列相加  

awk练习题
用awk 打印整个test.txt (以下操作都是用awk工具实现,针对test.txt)
查找所有包含 ‘bash‘ 的行
用 ‘:‘ 作为分隔符,查找第三段等于0的行
用 ‘:‘ 作为分隔符,查找第一段为 ‘root‘ 的行,并把该段的 ‘root‘ 换成 ‘toor‘ (可以连同sed一起使用)
用 ‘:‘ 作为分隔符,打印最后一段
打印行数大于20的所有行
用 ‘:‘ 作为分隔符,打印所有第三段小于第四段的行
用 ‘:‘ 作为分隔符,打印第一段以及最后一段,并且中间用 ‘@‘ 连接 (例如,第一行应该是这样的形式 ‘root@/bin/bash‘ )
用 ‘:‘ 作为分隔符,把整个文档的第四段相加,求和



本文出自 “你我同行” 博客,请务必保留此出处http://ondali.blog.51cto.com/6650368/1615965

文本文件查找,正则 sed awk

标签:linux bash 文本文件查找   正则2 sed awk   

原文地址:http://ondali.blog.51cto.com/6650368/1615965

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!