zoukankan      html  css  js  c++  java
  • linux文本处理常用命令

    linux文本处理常用命令

     

    linux文本处理命令:grep、sed、printf、awk

    1.grep

    grep的作用是按行查找字符,输出包含字符的行。

    #从文件查询
    grep 'hello' filename.txt
    #从管道的输入查询
    cat filename.txt|grep 'hello'

    grep使用示例:

    grep的查找主要就是基于基本正则表达式的匹配,下面只是简单的给一些常用例子供参考。

    grep 't[ae]st'   //查找tast或test

    grep '[0-9]'   //查找数字

    grep '[^a-z]oo' //查找Xoo,其中X是一个非a到z的字符

    grep '^the'  //查找以the开头的字符,这里注意区分^出现在[]里时代表“非某字符”,如上个例子,出现在[]外时代表"以某字符开头",如这个例子。

    grep '^$'  //查找空行

    grep 'o{2}'  //查找两个o,这里需要注意,{}在shell里有特殊意义,因此需要转义,这里与一般的正则使用不同,需要注意。

    egrep:

    我们知道正则表达式分为基本正则表达式和扩展正则表达式,但是grep只支持基本正则表达式,如果要是用扩展正则表达式,需要使用egrep命令。

    几个例子:

    egrep 'gd|good'  //查找gd或good

    egrep 'g(la|oo)d'  //查找glad或good

    egrep 'A(xyz)+C'  //查找AXC,其中X是一个或一个以上的'xyz'字符串。

    2.sed

    sed是一个很强大的命令,可以用来做行删除行新增行选取行替换字符串的替换这5种操作。

    sed是一个管道命令,可以处理管道输入。

    2.1行删除

    nl /etc/passwd | sed '2d'  //删除第2行

    下面将省略输入管道

    sed '2,5d'  //删除第2~5行

    sed '3,$d'  //删除第3到最后一行,$代表最后一行

    sed '/^$/d'  //删除空行

    2.2行新增

    sed '2a drink tea'  //在第二行下面追加一行"drink tea",a代表append

    sed '2i drink tea'  //在第二行上面插入一行"drink tea",i代表insert

    sed '2a a

    b

    c'  //在第二行下面追加三行 "a"、"b"、"c",只需要每行结尾加""即可。

    2.3行选取

    sed -n '5,7p'  //选取第5到7行输出,必须加-n参数,不然效果就是所有行都被输出,而5到7行输出两次。

    2.4行替换

    sed '2,5c No 2~5 lines'  //将第2到5行替换为一行字符串"No 2~5 lines"

    2.5字符串替换

    sed 's/要被替换的字符串/新的字符串/g'  //固定的格式,开头是s结尾是g,中间三个/分隔开要被替换的字符串和新的字符串,注意这里要被替换的字符串可以是正则表达式。

    sed -i  's/hello/halo/g'  filename.txt

    将操作结果直接写入文件

    默认用sed对文件做修改之后,只是输出修改后的文件,可以用>写入到新的文件。但是如果想修改原始文件,千万不能>到原始文件,这样执行的结果就是原文件直接被清空了。想要修改原始文件可以用 -i 参数,如:

    sed -i '2d' file.txt  //直接将原文件中的第二行删除。

    直接修改原文件是很危险的,一旦修改错误无法还原。可以先不加 -i 参数执行命令把修改结果打印出来,确认无误后再加上 -i 参数。

    #sed -i  "s/oldstring/goalstring/g" file   (要替换的字符串可以用正则表达式)
    #example1 replace the /apps to /appvol at the file test.txt
    sed -i "s//apps//appvol/g" test.txt
    
    #example2 replace the "apps" to "appvol"
    sed -i "s/"apps"/"appvol"/g" test.txt
    
    #example3 replace the "/apps" tp "/appvol"
    sed -i "s/"/apps/"/appvol/g" test.txt
    
    #example4 replace the "apps" tp "appvol"
    sed -e "s#"\apps#"\appvol#g" test.txt

    3.printf

    printf这个命令用语言不太好描述,但是一动手就明白了。

    把下面的内容保存为printf.txt:

    Name Chinese English Math Average
    DmTsai 80 60 92 77.33
    VBird 75 55 80 70.00
    Ken 60 90 70 73.33

    先cat看一下,是下面这个效果:

    现在用printf指令加一些参数来看一下,执行

    printf '%10s %10s %10s %10s %10s 
    ' `cat printf.txt`

    输出结果:

    是不是比cat输出的结果漂亮多了。

    %10s代表这一列的宽度固定为10个字符。更多的格式就不介绍了,这篇文章我们掌握一个%10s就够了。

    printf不是管道命令,要想用它处理文件必须像上面的命令那样使用`cat printf.txt`把文件内容给提出来。

    printf的使用相当广泛,后面的awk命令中也会应用到printf命令。

    4.awk

    awk命令主要是将文件通过分隔符拆成列来处理,还能通过条件判断对不同的行进行不同的处理,甚至还可以进行数值计算~

    我们也是通过例子来学习。

    我们先用last命令看一下最后登录的5个用户信息:

    图中的第一列是用户名,第三列是用户ip,现在我们想摘出这两列,用awk就可以做到:

    last -5|awk '{print $1 "	" $3}'

    输出:

    命令看起来挺复杂,不要着急,其实很简单。

    首先awk使用时有固定的格式:awk '{命令}',单引号和大括号就是固定的格式而已。

    然后上面的命令就是

    print $1 "	" $3    //awk默认会用空格和tab将每行分隔为N列,$1代表第一列,$3代表第三列。

    这样一看是不是简单多了。

    刚刚的last命令产生的数据默认就是用tab分隔的,现在我们看另一个例子,执行 cat /etc/passwd:

    这次产生的数据每行是用  : 分隔的,那么想使用awk输出第一列和第三列就需要执行分隔符:

    cat /etc/passwd|awk -F ':' '{print $1 "	" $3}'    // -F ':' 代表指定使用 : 作为分隔符

    执行结果:

    除了$1,$3这样的特殊符号,

    awk的命令中还可以使用下面的特殊符号:

    NF :每一行分隔后的列数

    NR :行号

    下面用一个综合的例子来说明awk的条件判断和数值计算,有这样一组数据保存为pay.txt:

    Name    1st   2nd   3rd
    VBird   23000   24000  25000
    DMTsai  21000   20000  23000
    Bird2   43000   42000  41000

    现在想加一列"Total",计算每一行的数值总和。

    用awk可以完成这个需求:

    cat pay.txt |awk 'NR==1 {printf "%10s %10s %10s %10s %10s 
    ",$1,$2,$3,$4,"Total"};NR>1 {printf "%10s %10s %10s %10s %10s 
    ",$1,$2,$3,$4,$2+$3+$4}'

    运行结果:

    这里有几个要点:

    1. 加入条件判断后,awk的格式为: awk '条件1 {命令1};条件2{命令2}'
    2. 条件判断有以下逻辑运算:
      • >
      • <
      • >=
      • <=
      • ==  //注意判断相等要用两个等号
      • !=
    3. 可以直接运算行内列的值($1、$2、$3)。
     
     
  • 相关阅读:
    shell文本过滤编程(一):grep和正则表达式【转】
    从头开始写项目Makefile(十):make内嵌函数及make命令显示【转】
    写文章 TEE技术分析【转】
    移动电子商务:五个技术标准与Trustonic TEE解决方案【转】
    在vscode中使用pylint-django插件解决pylint的一些不必要的错误提示【转】
    从零开始学习OpenCL开发(一)架构【转】
    一张图让你学会Python【转】
    关于ping以及TTL的分析【转】
    g++的编译选项:-Wl,-rpath=【转】
    【梦幻连连连】源代码分析(四)-触摸处理
  • 原文地址:https://www.cnblogs.com/lihuanhuan/p/10612133.html
Copyright © 2011-2022 走看看