linux学习之grep和sed的简单用法

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1
$
多次修改
用分号来分隔命令 实例: $ echo my name is zsh | sed ' s/is/are/; s/zsh/shz/'
2
注意分号必须是紧跟斜线之后的下一个字符
全局替换

g sed默认处理每一行中出现的第一个选定序列,如果 要处理出现的每一个项目,使用g 实例: $ echo my name is zsh zsh | sed 's/zsh/shz/g'
练习题
只打印
C 源文件中的 main() 函数
练习题
删除tot文件中从BEGIN开到END结束的块中包 含Name的行 sed '/^BEGIN/,/^END/{/Name/d;}' tot
sed的语法
sed
[address1[,address2]] [options] '{command}' [filename]
案例
输出匹配行的下一行
sed -n '/apple/{n;p}' express 区别: sed -n '/apple/n;p' express

sed更多功能

h :拷贝模板块的内容到内存中的缓冲区。 H :追加模板块的内容到内存中的缓冲区 g :获得内存缓冲区的内容并替代当前模板块中的文本。 G :获得内存缓冲区的内容并追加到当前模板块文本的后面 =: 出行号 x :互换模板块中的文本和缓冲区中的文本。

y命令
y是一个管局命令,拒绝使用后缀flag/g sed
'y/1234567890/abcdefghij/' sedy
n/N命令




n N Read/append the next line of input into the pattern space. 打印奇数行: cat -n express | sed -n 'p;n' 打印偶数行: cat -n express | sed -n 'n;p' 思考下面的功能: cat -n express | sed -n 'p;N' cat -n express | sed -n 'N;p' cat -n express | sed -n 'p;d' cat -n express | sed 'd;n' cat -n express | sed 'n;d' cat -n express | sed '1d;n;d'
-i '$d' express
―-f‖ 选项

脚本文件

$ cat sedlist /two/ s/1/2/ /three/ s/1/3/ 注意当调用 "-f" 选项时,在 源文件内或命令行中不使用 撇号






$ sed -f sedlist sample_one one 1 two 2 three 3 one 1 two 2 two 2 three 3 $
替换每行第N个匹配

$ echo my name is zsh zsh | sed 's/zsh/shz/1' $ echo my name is zsh zsh | sed 's/zsh/shz/2'
sed替换功能案例
cat
myfile.html <b>This</b> is what <b>I</b> meant. 删除HTML标记,也就是要得到: This is what I meant.
地址限定—除什么外
要删除除包含单词
"two" 的行之外的所有行: $ sed '/two/ !d' sample_one two 1 two 1 two 1 $
保存输出文件
$
sed '/two/ s/1/2/` sample_one >sample_two
直接修改原文件:-i
sed
$
{}
grep –n ‗o\{2\}‘ express $ grep –n ‗go\{2,5\}g‘ express $ grep –n ‗go\{2,\}g‘ express
$
字符类 描述



[:alnum:] 字母数字 [a-z A-Z 0-9] [:alpha:] 字母 [a-z A-Z] [:blank:] 空格或制表键 [:cntrl:] 任何控制字符 [:digit:] 数字 [0-9] [:graph:] 任何可视字符(无空格) [:lower:] 小写 [a-z] [:print:] 非控制字符 [:punct:] 标点字符 [:space:] 空格 [:upper:] 大写 [A-Z] [:xdigit:] 十六进制数字 [0-9 a-f A-F]
搜索特定字符串
grep –n ‗the‘ express $ grep –vn ‗the‘ express $ grep –in ‗the‘ express $ grep -l ‗the‘ *.c
$
在所有源文件中查找the,列出包含the 的文件名
[]的使用
grep –n ‗t[ae]st‘ express $ grep –n ‗oo‘ express $ grep –n ‗[^g]oo‘ express $ grep –n ‗[^a-z]oo‘ express $ grep –n ‗[0-9]‘ express
$
. 和*
grep –n ‗g..d‘ express $ grep –n ‗ooo*‘ express $ grep –n ‗goo*g‘ express $ grep –n ‗g*g‘ express $ grep –n ‗g.*g‘ express $ grep –n ‗[0-9][0-9]*‘ express
$
^和$
grep –n ‗^the‘ express $ grep –n ‗^[a-z]‘ express $ grep –n ‗^[^a-zA-Z]‘ express $ grep –n ‗\.$‘ express $ grep –n ‗^$‘ express $ grep –v ‗^$‘ express | grep –v ‗^#‘




$ sed -n -f sedlist sample_one two 2 three 3 two 2 two 2 three 3 $
Sed功能3: 增加和插入文本

sed-打印功能
‗p‘:打印命令 注意观测下面两个命令的区别: sed
-n '1p' express sed '1p' express
练习题
打印tot文件中从包含
"BEGIN" 的行开始,并 且以包含 "END" 的行结束的文本块: 思考: 1 如果文件中没有“BEGIN‖会怎样? 2 如果文件中没有“END‖会怎样?
案例
为文件加行号 sed
= express | sed 'N;s/\n/:/' 给非空行加行号 sed '/./=' express | sed '/./N;s/\n/:/'
案例
删除连续重复行 sed '$!N;/^\(.*\)\n\1$/!P;D' chongfu
案例
用sed实现tac功能 sed
sed-删除功能

带规则表达式的地址 删除注释行:sed -e '/^#/d' /etc/services | more 删除空行:sed -e '/^$/d' express 删除第一行到空行:sed -e '1,/^$/d' express 删除最后一行:sed -e '$d' express 删除包含apple的行到包含Her的行: sed -e '/apple/, /Her/d' express
-e '1!G;h;$!d' express
地址限定--匹配
将sample_one文件中包含‘two‘行的‘1‘替换为‘2‘ $ sed '/two/ s/1/2/‗ sample_one
地址限定--限制行

编辑器默认查看输入到流编辑器中的每一行,且默认在输入 到流编辑器中的每一行上进行编辑 $ sed '5,6 s/1/2/' sample_one
顺序逐行将文件读入到内存中。然后,它执
行为该行指定的所有操作,并在完成请求的 修改之后将该行放回到内存中,以将其转储 至终端
sed工作原理图

sed-删除功能d



d:Delete pattern space. Start next cycle. 观察命令结果:sed -e 'd' express 删除指定行:sed -e '1d' express 地址范围 :sed -e '1,10d' express 从一行开始每隔一行删一行:sed ‗0~1d‘ express 从第二行开始每隔7行删一行:sed‗1~7d‘ express
正则表达式
正则表达式
很多不同的unix命令都采用一种便捷一致的
方法来说明匹配模式,这种方法就是正则表 达式
先学习一个命令:grep
wenku.baidu.com


grep [-acinv] ‗搜索字符串’ filename -c:计算找到‘搜索字符串’ 的次数。 -i:忽略大小写的不同,所有大小写视为相同 -n:输出行号 -v:反向选择 -l只给出包含给定模式的文件列表,而不给出文件中的匹配行
sed替换功能案例
用sed实现unix2dos命令功能 unix2dos
express cat -v express sed -i 's/.$//' express 思考,怎样用sed命令将unix格式文件转换成 dos格式?
案例

案例:老大要求我替换一个大容量文件(大约6-7G)的某些信息,直接用 vim打开手动编辑的话那速度简直是苦不堪言,于是我再次想到了awk。 仅仅是一些替换工作就用awk太小题大做了,而且在我用awk处理的时候 出了一个大问题:文件太大,awk无法打开,我没有对这样的异常做防御, 导致后面的操作出现了一连串的问题,最终的结果就是我用了一个空文本 替换了刚才那个6-7G的文件。幸好还有备份,汗! 。正在我。。。。, 老大已经搞好了,就是用了一行sed: sed -i XXX -e 's/XXX/XXX/g'
sed功能:替换
's/{old
value}/{new value}/'
实例:
$
echo my name is zsh | sed 's/zsh/shz/'
多次修改
使用 –e 选项 实例: $ echo my name is zsh | sed -e ' s/is/are/' -e 's/zsh/shz/'
匹配行首的第一个字符
如果一行的头两个字符相同,就匹配他们
匹配一行中头一个字符跟最后一个字符相同的行。
正则表达式与命令行特殊符号的区别
ls –l * ls | grep –n ‗.*‘ $ ls z* ls | grep –n ‗^z.*‘ $ ls [!z]*
$
sed的使用
非交互式行编辑器
字符类 描述
注意区别以下两个命令: grep
-n '[[:space:]]are' express grep -n '[[:space:]]*are' express
保存匹配的字符串:\(…\)
将捕获的正则表达式匹配的字符串存储在编
号为1到9的“寄存器”中。 $ grep –n ‗o\{2\}‘ express $ grep –n ‗^\(.\)‘ express $ grep –n ‗^\(.\)\1‘ express $ grep –n ‗^\(.\).*\1$‘ express
安静模式



-n 实例: $ sed -n -f sedlist sample_one $ $ sed -n -f sedlist sample_one > sample_two $ cat sample_two $

-n和-p的配合使用



$ cat sedlist /two/ s/1/2/p /three/ s/1/3/p $
相关文档
最新文档