gerp , sed , awk

gerp 查找, sed 编辑, awk 根据内容分析并处理.程序员

 

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/gip

[line-address]q 退出, 匹配到某行退出, 提升效率字符串

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

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


举例:
sed '1d' abc 删除 abc 档案里的第一行, 注意, 这时会显示除了第一行以外的全部行, 由于第一行已经被删除了(实际文件并无被删除,而只是显示的时候被删除了)
sed -n '1d' abc 什么内容也不显示, 由于通过sed处理的行, 是个删除操做, 因此不现实.
sed '2,$d' abc 删除abc中从第二行到最后一行全部的内容, 注意, $符号正则表达式中表示行末尾, 可是这里并无说那行末尾, 就会指最后一行末尾, ^开头, 若是没有指定哪行开头, 那么就是第一行开头
sed '$d' abc 只删除了最后一行, 由于并无指定是那行末尾, 就认为是最后一行末尾
sed '/test/d' abc 文件中全部带 test 的行, 所有删除
sed '/test/a RRRRRRR' abc 将 RRRRRRR 追加到全部的带 test 行的下一行 也有可能经过行 sed '1,5c RRRRRRR' abc
sed '/test/c RRRRRRR' abc 将 RRRRRRR 替换全部带 test 的行, 固然, 这里也能够是经过行来进行替换, 好比 sed '1,5c RRRRRRR' abctest



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个连续小写字母的串效率

相关文章
相关标签/搜索