标签:常用 符号 清除 for 要求 选项 除了 修改 语法
//扩展一//1.过滤出带有某个关键词的行并输出行号
grep -n ‘root‘ /etc/passwd
2.过滤不带有某个关键词的行,并输出行号
grep -nv ‘nologin‘ /etc/passwd
3.过滤出所有包含数字的行
grep ‘[0-9]‘ /etc/inittab
4.过滤出所有不包含数字的行
grep -v ‘[0-9]‘ /etc/inittab
5.把所有以 ‘#’ 开头的行去除
grep -v ‘^#‘ /etc/inittab
6.去除所有空行和以 ‘#’ 开头的行
grep -v ‘^#‘ /etc/crontab |grep -v ‘^$‘
在正则表达式中, “^” 表示行的开始, “$” 表示行的结尾,那么空行则可以用 “^$” 表示
7.过滤任意一个字符与重复字符
grep ‘r..o‘ /etc/passwd
8.指定要过滤字符出现的次数
grep ‘o{2}‘ /etc/passwd
egrep
1.筛选一个或一个以上前面的字符
egrep ‘o+‘ test.txt
2.筛选零个或一个前面的字符
egrep ‘o?‘ test.txt
3.筛选字符串1或者字符串2
egrep ‘aaa|111|ooo‘ test.txt
4.egrep中( )的应用
egrep ‘r(oo|at)o‘ test.txt
用( )表示一个整体,例如(oo)+就表示1个 ‘oo’ 或者多个 ‘oo’
egrep ‘(oo)+‘ test.txt
sed工具的使用
grep实现的只是查找功能,而它却不能实现把查找的内容替换掉。sed工具以及下面要讲的awk工具就能实现把替换的文本输出到屏幕上的功能了,而且还有其他更丰富的功能。sed和awk都是流式编辑器,是针对文档的行来操作的。
1.打印某行
sed -n ‘n‘p filename 单引号内的n是一个数字,表示第几行:
sed -n ‘1,$‘p filename 把所有行都打印出来可以使用
2.打印包含某个字符串的行
sed -n ‘/root/‘p test.txt
3.-e可以实现多个行为
sed -e ‘1‘p -e ‘/111/‘p -n test.txt
4.删除某行或者多行
sed ‘1,3‘d test.txt
‘d’ 这个字符就是删除的动作了,不仅可以删除指定的单行以及多行,而且还可以删除匹配某个字符的行,另外还可以删除从某一行一直到文档末行。
5.替换字符或字符串
sed ‘1,2s/ot/to/g‘ test.txt
sed ‘s#ot#to#g‘ test.txt
‘s’ 就是替换的命令, ‘g’ 为本行中全局替换,如果不加 ‘g’ 只换该行中出现的第一个。除了可以使用 ‘/’ 作为分隔符外,还可以使用其他特殊字符例如 ‘#’ 或者 ‘@’ 都没有问题。
6.调换两个字符串的位置
sed ‘s/(rot)(.)(bash)/\3\2\1/‘ test.txt
用 () 把所想要替换的字符括起来成为一个整体,因为括号在sed中属于特殊符号,所以需要在前面加脱意字符 ‘’, 替换时则写成 ‘1’, ‘‘2’, ‘‘3’ 的形式。除了调换两个字符串的位置外,还常常用到在某一行前或者后增加指定内容。
sed ‘s/^.$/123&/‘ test.txt
7.直接修改文件的内容
sed -i ‘s/ot/to/g‘ test.txt
这个命令可以直接把文件修改.
练习:把/etc/passwd 复制到/root/test.txt,用sed打印所有行
打印test.txt的3到10行
打印test.txt 中包含 ‘root’ 的行
删除test.txt 的15行以及以后所有行
删除test.txt中包含 ‘bash’ 的行
替换test.txt 中 ‘root’ 为 ‘toor’
替换test.txt中 ‘/sbin/nologin’ 为 ‘/bin/login’
删除test.txt中5到10行中所有的数字
删除test.txt 中所有特殊字符(除了数字以及大小写字母)
把test.txt中第一个单词和最后一个单词调换位置
把test.txt中出现的第一个数字和最后一个单词替换位置
把test.txt 中第一个数字移动到行末尾
在test.txt 20行到末行最前面加 ‘aaa:’
阿铭希望你能尽量多想一想,答案只是用来作为参考的。
sed习题答案
练习:
用awk 打印整个test.txt (以下操作都是用awk工具实现,针对test.txt)
查找所有包含 ‘bash’ 的行
用 ‘:’ 作为分隔符,查找第三段等于0的行
用 ‘:’ 作为分隔符,查找第一段为 ‘root’ 的行,并把该段的 ‘root’ 换成 ‘toor’ (可以连同sed一起使用)
用 ‘:’ 作为分隔符,打印最后一段
打印行数大于20的所有行
用 ‘:’ 作为分隔符,打印所有第三段小于第四段的行
用 ‘:’ 作为分隔符,打印第一段以及最后一段,并且中间用 ‘@’ 连接 (例如,第一行应该是这样的形式 ‘root@/bin/bash‘ )
用 ‘:’ 作为分隔符,把整个文档的第四段相加,求和
awk习题答案
//扩展二//
(1)打印某行到某行之间的内容http://ask.apelearn.com/question/559
sed -n ‘/[abcfd]/,/[rty]/p‘ test 截取[abcfd]到[rty]间的内容
(2)sed转换大小写 http://ask.apelearn.com/question/7758
sed中,使用\u表示大写,\l表示小写
awk 合并一个文件 http://ask.apelearn.com/question/493
awk ‘NR==FNR{a[$1]=$2}NR>FNR{print $0,a[$1]}‘ 1.txt 2.txt
解释:把两个文件中,第一列相同的行合并到同一行中。
NR表示读取的行数, FNR表示读取的当前行数,大家可以运行这个命令 awk ‘{print NR,FNR}‘ 1.txt 2.txt,比较NR和FNR,所以其实NR==FNR 就表示读取1.txt的时候。 同理NR>FNR表示读取2.txt的时候
数组a其实就相当于一个map。
把一个文件多行连接成一行 http://ask.apelearn.com/question/266
a=cat file
;echo $a
awk ‘{printf("%s ",$0)}‘ file // %s 后记得要有一空格,否则出来就是完全连在一起的,中间连空格都没有
cat file |xargs
awk中gsub函数的使用 http://ask.apelearn.com/question/200
awk ‘gsub(/www/,"abc")‘ /etc/passwd // passwd文件中把所有www替换为abc
awk -F ‘:‘ ‘gsub(/www/,"abc",$1) {print $0}‘ /etc/passwd // 替换$1中的www为abc
awk 截取指定多个域为一行 http://ask.apelearn.com/question/224
用awk指定分隔符把文本分为若干段。如何把相同段的内容弄到一行?
以/etc/passwd为例,该文件以":"作为分隔符,分为了7段。
for i in seq 1 7
do
awk -F ‘:‘ -v a=$i ‘{printf $a " "}‘ /etc/passwd
echo
done
过滤两个或多个关键词 http://ask.apelearn.com/question/198
grep -E ‘123|abc‘ filename // 找出文件(filename)中包含123或者包含abc的行
egrep ‘123|abc‘ filename //用egrep同样可以实现
awk ‘/123|abc/‘ filename // awk 的实现方式
用awk生成以下结构文件 http://ask.apelearn.com/question/5494
awk用print打印单引号 http://ask.apelearn.com/question/1738
比较绕,不用死记硬背,以后用的时候,稍微多试几次就出来了。
awk ‘BEGIN{print "a‘"‘"‘s"}‘ //不用脱义,就多写几个单引号、双引号
awk ‘BEGIN{print "a‘\‘‘s"}‘ //用脱义,脱义的是单引号
awk ‘BEGIN{print "a\"s"}‘ //用脱义,脱义的是双引号
把两个文件中相同的行合并成一行 http://ask.apelearn.com/question/945
paste filename1 filename2
如果,你想在两个文件连接处用一个指定的字符连接,还可以用-d来指定
paste -d ‘+‘ a.txt b.txt
标签:常用 符号 清除 for 要求 选项 除了 修改 语法
原文地址:http://blog.51cto.com/iammalt/2307631