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

打印文件中特定某行到某行之间的内容

[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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值