您的位置:首页 > 其它

关于grep,sed,awk的几个用法

2017-11-23 21:11 579 查看
打印文件中特定某行到某行之间的内容

[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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  awk sed