关于grep,sed,awk的几个用法
2017-11-23 21:11
579 查看
打印文件中特定某行到某行之间的内容
你需要得到
sed 是支持准确查找的
注意:这里[abcde]是一个整体,不能用sed -r进行脱意。
类似的用法可以用在查看日志上。
查找两个时间段之间的日志查看第一段(awk ‘{print $1}’)排序去重(sort|uniq -c)在反向排序(sort -rn)看到的就是最后面的时间段的日志。
sed转换大小写:
sed中,使用\u表示大写,\l表示小写
1、\b只能匹配字母、数字、汉字、下划线
2、\b就近匹配,比如\bAB 匹配A,AB\b 匹配B;但如果只写一个\b或者在两个字母、数字、汉字、下划线之间有\b时就在所有字符或者两个字母、数字、汉字、下划线之间所有字符去逐个匹配
将每一个单词的第一个小写字母改成大写:
将所有小写改成大写:
将大写改成小写:
在文件中以a开头的行尾加上数字5:
如何使用sed打印1到100行包含某个字符串(abc)的行:
awk使用外部shell变量:
-v选项用于定义参数,这里表示将变量A的值赋予GET_A。
有多少个变量需要赋值,就需要多少个-v选项。与之等价的:应用于脚本中:
-v选项不要想的太复杂,就是一个间接引用的意思,意思就是A的值为44,但是你只想用44这个值,却不想用A这个变量,就像老板需要小三,但不想她怀孕一样。于是重新把A赋值给另一个变量,a,然后在awk中只引用a,就可以使用这个44的值。至于为什么绕这个弯,因为A是外部变量啊!!!
一个应用的shell:
这里先将filename排序(sort -n filename)输入到awk中,
这时输出为:
1111111:13443253456
1111111:13643543544
2222222:13211222122
2222222:12123123123
3333333:12341243123
取第一段(awk -F ‘:’ ‘{print $1}’)
这时结果为:
1111111
1111111
2222222
2222222
3333333
去重复并定向到id.txt(uniq >id.txt)
这时(id.txt)结果是:
1111111
2222222
3333333
然后做for循环:
从id.txt中取id
echo打印出[1111111]
将1111111赋值到id2中,在filename中找匹配到1111111打印第二段。
做完为止。
应用举例:一个文件每行都有一个数字,现在需要把每行的数字用“+”连接起来。
cat a
96
1093
1855
1253
1364
1332
2308
2589
2531
1239
2164
2826
2787
2145
2617
4311
1810
2115
1235
96+1093+1855+1253+1364+1332+2308+2589+2531+1239+2164+2826+2787+2145+2617+4311+1810+2115+1235+
这里注意,最后一个是带“+”的。echo “” 的作用是换行。
这里printf (“%s+”,$0)看到了一丝c语言的影子。%s+ 表示输出的格式,s代指后面的 \$0
awk中的替换
类似于sed ‘s/www/abc/g’ /etc/passwd
类似于sed ‘s/www/abc/’ /etc/passwd
grep 或 egrep 或awk 过滤两个或多个关键词
awk用法:
http://www.cnblogs.com/emanlee/p/3327576.html
[root@shuai-01 awk]# cat test [abcde] ert fff ** abcde teb [abcde] 123 234 try 234 bcd tr [try] try **
你需要得到
[abcde] 123 234 try 234 bcd tr [try]
sed 是支持准确查找的
[root@shuai-01 awk]# sed -n '/\[abcde\]/,/\[try\]/'p test
注意:这里[abcde]是一个整体,不能用sed -r进行脱意。
类似的用法可以用在查看日志上。
sed -n '/03\/Mar\/2016:02:52/,/03\/Mar\/2016:03:03:20/'p /usr/local/nginx/logs/cn.log |awk '{print $1}'|sort|uniq -c|sort -rn
查找两个时间段之间的日志查看第一段(awk ‘{print $1}’)排序去重(sort|uniq -c)在反向排序(sort -rn)看到的就是最后面的时间段的日志。
sed转换大小写:
sed中,使用\u表示大写,\l表示小写
1、\b只能匹配字母、数字、汉字、下划线
2、\b就近匹配,比如\bAB 匹配A,AB\b 匹配B;但如果只写一个\b或者在两个字母、数字、汉字、下划线之间有\b时就在所有字符或者两个字母、数字、汉字、下划线之间所有字符去逐个匹配
将每一个单词的第一个小写字母改成大写:
[root@shuai-01 awk]# sed 's/\b[a-z]/\u&/g' test.txt Rootx:Shuai:0:Root:/Root:/Bin/Bash Bin:X:1:1:Bin:/Bin:/Sbin/Nologin Daemon:X:2:2:Daemon:/Sbin:/Sbin/Nologin Adm:X:3:4:Adm:/Var/Adm:/Sbin/Nologin Lp:X:4:7:Lp:/Var/Spool/Lpd:/Sbin/Nologin Sync:X:5:0:Sync:/Sbin:/Bin/Sync
将所有小写改成大写:
[root@shuai-01 awk]# sed 's/[a-z]/\u&/g' test.txt ROOTX:SHUAI:0:ROOT:/ROOT:/BIN/BASH BIN:X:1:1:BIN:/BIN:/SBIN/NOLOGIN DAEMON:X:2:2:DAEMON:/SBIN:/SBIN/NOLOGIN ADM:X:3:4:ADM:/VAR/ADM:/SBIN/NOLOGIN LP:X:4:7:LP:/VAR/SPOOL/LPD:/SBIN/NOLOGIN SYNC:X:5:0:SYNC:/SBIN:/BIN/SYNC
将大写改成小写:
[root@shuai-01 awk]# sed 's/[A-Z]/\l&/g' test.txt rootx:shuai:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin adm:x:3:4:adm:/var/adm:/sbin/nologin lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin sync:x:5:0:sync:/sbin:/bin/sync
在文件中以a开头的行尾加上数字5:
[root@shuai-01 awk]# sed -r 's/(^a.*)/& 5/g' 1.txt 1 2 aa bb 5 dd cc 1 adsd shaudib232344shiafdn hsuai s123 23764 dhua 234djhbf : [root@shuai-01 awk]# sed -r 's/(^a.*)/\1 5/g' 1.txt 1 2 aa bb 5 dd cc 1 adsd shaudib232344shiafdn hsuai s123 23764 dhua 234djhbf :
如何使用sed打印1到100行包含某个字符串(abc)的行:
sed -n '1,100{/abc/p}' 1.txt
awk使用外部shell变量:
A=44 awk -v GET_A=$A ’{print GET_A}’
-v选项用于定义参数,这里表示将变量A的值赋予GET_A。
有多少个变量需要赋值,就需要多少个-v选项。与之等价的:应用于脚本中:
-v选项不要想的太复杂,就是一个间接引用的意思,意思就是A的值为44,但是你只想用44这个值,却不想用A这个变量,就像老板需要小三,但不想她怀孕一样。于是重新把A赋值给另一个变量,a,然后在awk中只引用a,就可以使用这个44的值。至于为什么绕这个弯,因为A是外部变量啊!!!
一个应用的shell:
附件: cat filename 1111111:13443253456 2222222:13211222122 1111111:13643543544 3333333:12341243123 2222222:12123123123 #! /bin/bash sort -n filename |awk -F ':' '{print $1}'|uniq >id.txt for id in `cat id.txt`; do echo "[$id]" awk -v id2=$id -F ':' '$1==id2 {print $2}' filename // 另外的方式为: awk -F ':' '$1=="'id'" {print $2}' filename done
这里先将filename排序(sort -n filename)输入到awk中,
这时输出为:
1111111:13443253456
1111111:13643543544
2222222:13211222122
2222222:12123123123
3333333:12341243123
取第一段(awk -F ‘:’ ‘{print $1}’)
这时结果为:
1111111
1111111
2222222
2222222
3333333
去重复并定向到id.txt(uniq >id.txt)
这时(id.txt)结果是:
1111111
2222222
3333333
然后做for循环:
从id.txt中取id
echo打印出[1111111]
将1111111赋值到id2中,在filename中找匹配到1111111打印第二段。
做完为止。
运行脚本后结果为: [1111111] 13443253456 13643543544 [2222222] 13211222122 12123123123 [3333333] 12341243123
应用举例:一个文件每行都有一个数字,现在需要把每行的数字用“+”连接起来。
cat a
96
1093
1855
1253
1364
1332
2308
2589
2531
1239
2164
2826
2787
2145
2617
4311
1810
2115
1235
awk '{printf ("%s+",$0)}' a; echo ""
96+1093+1855+1253+1364+1332+2308+2589+2531+1239+2164+2826+2787+2145+2617+4311+1810+2115+1235+
这里注意,最后一个是带“+”的。echo “” 的作用是换行。
这里printf (“%s+”,$0)看到了一丝c语言的影子。%s+ 表示输出的格式,s代指后面的 \$0
awk中的替换
awk 'gsub(/www/,"abc")' /etc/passwd // passwd文件中把所有www替换为abc
类似于sed ‘s/www/abc/g’ /etc/passwd
awk 'sub(/www/,"abc")' /etc/passwd // passwd文件中把第一次出现的www替换为abc
类似于sed ‘s/www/abc/’ /etc/passwd
awk -F ':' 'gsub(/www/,"abc",$1) {print $0}' /etc/passwd // 替换$1中的www为abc
grep 或 egrep 或awk 过滤两个或多个关键词
grep -E '123|abc' filename // 找出文件(filename)中包含123或者包含abc的行 egrep '123|abc' filename //用egrep同样可以实现 awk '/123|abc/' filename // awk 的实现方式
awk用法:
http://www.cnblogs.com/emanlee/p/3327576.html
相关文章推荐
- 几个常用的文本处理shell 命令:find、grep、xargs、sort、uniq、tr、cut、paste、wc、sed、awk
- linux文本处理 sort,grep,sed,awk,uniq 用法
- Linux之三剑客,awk、sed、grep的用法
- 总结Linux中用于文本处理的awk、sed、grep命令用法
- GREP、SED、AWK、TR、SORT、UNIQ的一些用法
- grep sed awk find用法
- linux文本处理 sort,grep,sed,awk,uniq 用法
- grep_sed_awk用法汇总
- 转 -- 【Shell】【经验】awk sed grep find sort常用配搭用法
- grep,sed,awk的用法举例
- linux的grep、sed、awk用法
- grep、sed和awk基本用法汇总
- grep sed awk find的用法归纳
- 获取文本中你需要的字段的 几个命令 grep awk cut tr sed
- grep sed awk find的用法归纳
- linux下grep、awk和sed工具用法概览
- GREP、SED、AWK、TR、SORT、UNIQ的一些用法
- linux文本处理 sort,grep,sed,awk,uniq 用法
- 获取文本中你须要的字段的 几个命令 grep awk cut tr sed
- grep,awk,sed简单用法