Linux的文本编辑diff & sed & awk & grep

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux的文本编辑diff & sed & awk & grep相关的知识,希望对你有一定的参考价值。

grep(关键字: 截取) 文本搜集工具, 结合正则表达式非常强大
   主要参数 []
   -c : 只输出匹配的行
   -I : 不区分大小写
   -h : 查询多文件时不显示文件名
   -l : 查询多文件时, 只输出包含匹配字符的文件名
   -n : 显示匹配的行号及行
   -v : 显示不包含匹配文本的所有行(我经常用除去grep本身)
   基本工作方式: grep 要匹配的内容 文件名, 例如:
   grep ‘test‘ d* 显示所有以d开头的文件中包含test的行
   grep ‘test‘ aa bb cc 显示在 aa bb cc 文件中包含test的行
   grep ‘[a-z]\{5}\‘ aa 显示所有包含字符串至少有5个连续小写字母的串




awk(关键字:分析&处理) 一行一行的分析处理 awk ‘条件类型1{动作1}条件类型2{动作2}‘ filename, awk 也可以读取来自前一个指令的 standard input
   相对于sed常常用于一整行处理, awk则比较倾向于一行当中分成数个"字段"(区域)来处理, 默认的分隔符是空格键或tab键
   例如:
   last -n 5 | awk ‘{print $1 "\t" $3}‘  这里大括号内$1"\t"$3 之间不加空格也可以, 不过最好还是加上个空格, 另外注意"\t"是有双引号的, 因为本身这些内容都在单引号内
   $0 代表整行 $1代表第一个区域, 依此类推
   awk的处理流程是:
   1. 读第一行, 将第一行资料填入变量 $0, $1... 等变量中
   2. 依据条件限制, 执行动作
   3. 接下来执行下一行
   所以, AWK一次处理是一行, 而一次中处理的最小单位是一个区域
   另外还有3个变量, NF: 每一行处理的字段数, NR 目前处理到第几行 FS 目前的分隔符
   逻辑判断 > < >= <= == !== , 赋值直接使用=
   cat /etc/passwd | awk ‘{FS=":"} $3<10 {print $1 "\t" $3}‘ 首先定义分隔符为:, 然后判断, 注意看, 判断没有写在{}中, 然后执行动作, FS=":"这是一个动作, 赋值动作, 不是一个判断, 所以不写在{}中
   BEGIN END , 给程序员一个初始化和收尾的工作, BEGIN之后列出的操作在{}内将在awk开始扫描输入之前执行, 而END{}内的操作, 将在扫描完输入文件后执行.
   awk ‘/test/ {print NR}‘ abc 将带有test的行的行号打印出来, 注意//之间可以使用正则表达式
   awk {}内, 可以使用 if else ,for(i=0;i<10;i++), i=1 while(i<NF)
   可见, awk的很多用法都等同于C语言, 比如"\t" 分隔符, print的格式, if, while, for 等等

awk 是相当复杂的工具, 真正使用时, 再补充吧. (有关工具的picture)



sed(关键字: 编辑) 以行为单位的文本编辑工具 sed可以直接修改档案, 不过一般不推荐这么做, 可以分析 standard input
基本工作方式: sed [-nef] ‘[动作]‘ [输入文本]
       -n : 安静模式, 一般sed用法中, 来自stdin的数据一般会被列出到屏幕上, 如果使用-n参数后, 只有经过sed处理的那一行被列出来.
       -e : 多重编辑, 比如你同时又想删除某行, 又想改变其他行, 那么可以用 sed -e ‘1,5d‘ -e ‘s/abc/xxx/g‘ filename
       -f : 首先将 sed的动作写在一个档案内, 然后通过 sed -f scriptfile 就可以直接执行 scriptfile 内的sed动作 (没有实验成功, 不推荐使用)
       -i : 直接编辑, 这回就是真的改变文件中的内容了, 别的都只是改变显示. (不推荐使用)
   动作:
   a 新增, a 后面可以接字符串, 而这个字符串会在新的一行出现. (下一行)
   c 取代, c 后面的字符串, 这些字符串可以取代 n1,n2之间的行
   d 删除, 后面不接任何东西
   i 插入, 后面的字符串, 会在上一行出现
   p 打印, 将选择的资料列出, 通常和 sed -n 一起运作 sed -n ‘3p‘ 只打印第3行
   s 取代, 类似vi中的取代, 1,20s/old/new/g

[line-address]q 退出, 匹配到某行退出, 提高效率

[line-address]r 匹配到的行读取某文件 例如: sed ‘1r qqq‘ abc , 注意, 写入的文本是写在了第1行的后边, 也就是第2行

[line-address]w file, 匹配到的行写入某文件  例如: sed -n ‘/m/w qqq‘ abc , 从abc中读取带m的行写到qqq文件中, 注意, 这个写入带有覆盖性.


以上是关于Linux的文本编辑diff & sed & awk & grep的主要内容,如果未能解决你的问题,请参考以下文章

linux shell 之在线文本编辑sed

Linux的awk、grep、sed工具,实现文本查找、编辑 、格式化

打开高效文本编辑之门_调用Linux的sed命令

Linux三剑客-sed批量编辑文本

linux--文本处理sed

Linux sed命令 以行为单位编辑文本,或替换文本中的文字