转自:https://www.cnblogs.com/sheeva/p/6406285.html

引子

作为一个偏爱windows的程序员,以前做文本处理的时候总是喜欢在windows下用notepad++等图形化工具处理,比如有时需要把linux服务器上一个文件进行一次全局字符串替换这样简单的操作,还得把文件down到本地编辑好再传回去。这两天买了本《鸟哥的Linux私房菜》,终于静下心系统的学习了一下linux下的文本处理,感觉其实没有想象的难,如果早点学会节约下来的大量时间肯定远超过学习所花的时间。

概览

先说一下本文要介绍的内容:

  1. 简单回顾一下正则表达式,如果熟悉正则,至少知道正则分为基本正则和扩展正则可以跳过该部分。
  2. 本文主体:介绍4个linux文本处理命令:grep、sed、printf、awk。

下面正式开始。

正则表达式回顾

这部分是给会正则表达式的读者简单回顾一下正则表达式,如果没学过正则表达式的读者建议先找相关资料学习正则表达式再来看本文。

正则表达式分为基本正则表达式和扩展正则表达式,内容如下:

基本正则表达式

正则表达式字符 含义
^word 查找以word开头的文本
word$ 查找以word结尾的文本
. 代表一个任意字符
\ 转义符
* 0到多个字符
[abc] 代表一个字符,这个字符是a或b或c
[a-z];[0-9] 代表a到z中的一个字符;0到9中的一个数字
[^abc] 代表一个非a、b、c的字符
{m,n} m到n个字符

扩展正则表达式

正则表达式字符 含义
+ 一个或多个字符
零个或一个字符
| 或者
() 分组

文本处理命令

grep

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

grep用法:

grep一般有两种用法,一种是从文件查找,一种是从管道的输入查找,

  1. grep 'word' file.txt
  2. cat file.txt|grep 'word'

grep的常用参数:

参数 含义及示例
-n 输出结果加行号
--color=auto 匹配的关键字高亮显示
-A3 输出匹配行的后三行
-B2    输出匹配行的前两行
-v   反向查找,即输出不包含关键字的行
-i 关键字匹配时忽略关键字大小写

grep使用小技巧:

多数情况我们都想要高亮关键词(使用--color=auto参数),因此可以在~/.bashrc文件中添加上:

alias grep='grep --color=auto'

,再用

source ~/.bashrc

让配置生效。这样当我们使用grep的时候,就自动带了--color=auto参数。

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'字符串。

sed

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

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

1.行删除

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

下面将省略输入管道

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

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

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

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",只需要每行结尾加"\"即可。

3.行选取

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

4.行替换

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

5.字符串替换

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

6. 字符串模糊替换

sed -i 's/arg_ssid=.*/arg_ssid=\"Aaron\"/' file.txt          #把含有arg_ssid=这个字符串的行替换为arg_ssid="Aaron", 注意后面模糊需要加一个点, .*, 另外该行中只替换匹配部分的字符串,不包括arg_ssid之前的内容

将操作结果直接写入文件

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

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

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

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 \n' `cat printf.txt`

输出结果:

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

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

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

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

awk

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

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

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

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

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

输出:

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

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

然后上面的命令就是

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

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

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

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

cat /etc/passwd|awk -F ':' '{print $1 "\t" $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 \n",$1,$2,$3,$4,"Total"};NR>1 {printf "%10s %10s %10s %10s %10s \n",$1,$2,$3,$4,$2+$3+$4}'

运行结果:

这里有几个要点:

  1. 加入条件判断后,awk的格式为: awk '条件1 {命令1};条件2{命令2}'
  2. 条件判断有以下逻辑运算:
    • >
    • <
    • >=
    • <=
    • ==  //注意判断相等要用两个等号
    • !=
  3. 可以直接运算行内列的值($1、$2、$3)。

总结

这篇文章首先回顾了正则表达式(基本正则表达式、扩展正则表达式),然后介绍了4个常用命令,最后我们归纳一下四个命令的用途:

命令 用途
grep/egrep 关键字查找
sed
  1. 行的删除、添加、替换、选取
  2. 关键字替换
printf  文件格式化输出
awk
  1. 将每行按分隔符拆分成列并选取某些列
  2. 通过逻辑判断对不同行进行不同的处理
  3. 对一行中的几列数值进行计算

[文件]Linux文本处理常用命令总结的更多相关文章

  1. linux文本处理常用命令

    linux文本处理常用命令   linux文本处理命令:grep.sed.printf.awk 1.grep grep的作用是按行查找字符,输出包含字符的行. #从文件查询 grep 'hello' ...

  2. linux:终端常用命令 + vi命令修改文件及保存 方法

    首先介绍一下Ubuntu下各个目录的一般作用: /  这就是根目录,一台电脑有且只有一个根目录,所有的文件都是从这里开始的.举个例子:当你在终端里输入“/home”,你其实是在告诉电脑,先从/(根目录 ...

  3. linux vi编辑常用命令

      linux vi编辑常用命令 来源:互联网 作者:佚名 时间:07-10 21:31:14 [大 中 小] linux vi编辑常用命令,需要的朋友可以参考下   vi编辑器中有三种状态模式 1. ...

  4. Linux学习之CentOS(二)--初识linux的一些常用命令

    Linux学习之CentOS(二)--初识linux的一些常用命令 在VM上安装完了CentOS6.4以后,看着linux系统成功跑起来,心里小激动了一把......但是前方学习的道路还很遥远... ...

  5. Linux中许多常用命令是必须掌握的,这里将我学linux入门时学的一些常用的基本命令分享给大家一下,希望可以帮助你们。

    Linux中许多常用命令是必须掌握的,这里将我学linux入门时学的一些常用的基本命令分享给大家一下,希望可以帮助你们. 这个是我将鸟哥书上的进行了一下整理的,希望不要涉及到版权问题. 1.显示日期的 ...

  6. linux 下 mysql 常用命令

    linux 下 mysql 常用命令   阅读目录 ====================== 1.开启和关闭 1.1.开启 1.2.关闭 1.3.重启 2.登录 2.1.密码明文 2.2.密码密文 ...

  7. Linux 使用 github 常用命令

    Linux 使用 github  常用命令 今天整理一下常用的 github 命令,自己只是一个编程小白,有些地方可能做的不是很好,仅仅用作自己的学习使用. 创建一个文件夹用于存放github仓库 m ...

  8. Linux Tomcat部署常用命令

    Linux Tomcat部署常用命令 1.连接服务器 2.进入webapps目录:  cd /usr/local/tomcat8080/webapps/ 3.上传文件(war包等):rz 4.删除文件 ...

  9. Linux课程---2、Linux下最常用命令(查看帮助命令)

    Linux课程---2.Linux下最常用命令(查看帮助命令) 一.总结 一句话总结: man 1.显示文件? ls:ls带其它参数详情可以man ls man ls:比如 ls -a显示隐藏文件,l ...

随机推荐

  1. 【转载】Hibernate之hbm.xml集合映射的使用(Set集合映射,list集合映射,Map集合映射)

    https://www.cnblogs.com/biehongli/p/6555994.html

  2. Java – How to join Arrays

    Java – How to join Arrays In this article, we will show you a few ways to join a Java Array. Apache ...

  3. 使用 MD5 加密 去重对插入的影响

    现在有3000条数据,需要插入到数据库中去,使用的是对链接进行MD5加密, hashcode = md5(str(item_url))然后在数据库中设置 hashcode 为UNIQUE索引 3000 ...

  4. MIUI 们的发展蓝图:“罪恶”秘密背后的金钱和机遇

    (原文来自 AllThingsD)   听起来有点唬人,但是移动变革的确是这个时代最大的一次技术平台升级事件.这场趋势实在太浩大,不断地循环往复,对于创业者(还有像我这样的投资人来说),则意味着令人激 ...

  5. BUG处理流程说明

    一.        BUG处理流程图: 流程描述: 1.  测试人员发现bug提交给开发. 2.  开发人员判断是否是bug. 3.  如果是bug,进行修改,修改完成后更改bug状态为已解决. 4. ...

  6. 使用maven生成可执行的jar包

    从pom的xsi中可以打开描述pom的schema: 可以看到pom中,project的结构: 默认的mvn install生成的jar是不带主类入口的,需要在maven-compile-plugin ...

  7. Java数据结构和算法(五):队列

    简介 队列(queue)是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表.进行插入操作的端称为 ...

  8. MySQL与Oracle之间互相拷贝数据的Java程序

    因为工作需要,先是需要将一个小型的MySQL数据库中的数据拷贝到Oracle中:近期又有需要将一个中型的Oracle数据库拷贝到MySQL中.曾经找过网上各种转换工具,大多收费的,自己写个吧,还一切可 ...

  9. Enum,Int,String的互相转换 枚举转换

    Enum为枚举提供基类,其基础类型可以是除 Char 外的任何整型.如果没有显式声明基础类型,则使用 Int32.编程语言通常提供语法来声明由一组已命名的常数和它们的值组成的枚举. 注意:枚举类型的基 ...

  10. 菜鸟译文(一)——Java中的继承和组合

    阅读英文的能力对于程序员来说,是很重要的.这几年也一直在学习英文,今天心血来潮,就在网上找了一篇简短的博文翻译一下.水平一般,能力有限,还请各位看官多多指点. 译文: 本文将会举例说明Java中继承和 ...