-
写一个shell命令,统计apache日志文件(access_log)中某一天中每个URL的访问次数,并按照次数由小到大的顺序排序输出:
# cat /application/nginx/logs/20170202_access_www.log |awk '{print $7}'|sort| uniq -c |sort -n
awk '{print $7}' 匹配到 url 记录即日志文件格式的($http_referer)字段
sort 是排序 ,并且标准输出到屏幕
uniq -c 统计重复的行的总数
sort -n 是从小到达排序(如果是从大到小排序 加入-r (倒序))
2. 用netstat命令配合其他shell命令,按照来源IP统计下所有到80端口的ESTABLISHED状态链接的个数,输出结果类似(第一列为连接数,第二列为IP):
12 202.165.123.2
35 202.165.123.2
69 202.165.123.2
# netstat | grep -E "80&ESTABLISHED" | awk '{print $5}'| cut -d":" -f1 |sort |uniq –c | sort –n
同理这个也是一样的。
grep -E 是扩展的正则匹配 可以同时匹配 80 ESTABLISHED
awk '{print $5}' 匹配出IP地址和进程号( 格式 ip:pid) 这里需要继续拆分
cut -d":" -f1 以:为分隔符 取出第一部分就是 ip
uniq -c 统计重复的行数
sort -n 排序
3.写一个sed命令,修改/tmp/input.txt文件的内容,要求:(1) 删除所有空行;(2) 一行中,如果包含"11111",则在"11111"前面插入"AAA",在"11111"后面插入"BBB",比如:将内容为0000111112222的一行改为:0000AAA11111BBB2222
# echo -e "0000111112222\n\n">abc
# sed '/^$/d' abc
0000111112222
1. 多个sed 命令集合
# sed 's/0000/0000AAA/ ; s/2222/BBB222/' abc
0000AAA11111BBB222
2.精确匹配
# sed 's/\(11111\)/AAA\1BBB/g' abc
0000AAA11111BBB2222
3.直接替换
# sed 's/11111/AAA11111BBB/g' abc
0000AAA11111BBB2222
sed :流编辑器,过滤和替换文本。
工作原理:sed命令将当前处理的行读入模式空间进行处理,处理完把结果输出,并清空模式空间。然后再将下一行读入模式空间进行处理输出,以此类推,直到最后一行。还有一个空间叫保持空间,又称暂存空间,可以暂时存放一些处理的数据,但不能直接输出,只能放到模式空间输出。
这两个空间其实就是在内存中初始化的一个内存区域,存放正在处理的数据和临时存放的数据。选项 :
-n 不打印模式空间
-i 修改数据
-r 正则表达式的扩展模式
-e 多个sed 命令一起执行
sed 命令用法简析:
# echo -e "booktestbook\nbook\n\ntest">abc 实验文件创建
1.替换命令s
# sed -n 's/book/BOOK/p' abc
BOOKtestbook
BOOK
2.这里使用 -n p 组合作用:常用于显示行的内容。p 的作用是打印 print
如果需要你显示12-19行的内容可以:# sed -n '12,19p' file
这里需要注意的参数是 -i
上面几个sed命令只是 查看。不是修改。如果想修改 需要加入 -i 参数
# sed -i 's/book/BOOK/p' abc
这里就是把源文件中的所有book 都替换成了BOOK
3.上个命令的 g 参数是作用是 全部替换
比较一下加不加 g 的区别
# sed -n 's/book/BOOK/p' abc
BOOKtestbook
BOOK
没有替换所有的book字符
# sed -n 's/book/BOOK/gp' abc
BOOKtestBOOK
BOOK
替换了所有的book字符
如果需要从N处开始替换,可以使用Ng
# echo abababab | sed 's/ab/AB/2g'
abABABAB
# echo abababab | sed 's/ab/AB/3g'
ababABAB
4.删除命令 d
# sed '/^$/d' abc (删除空行)
booktestbook
book
test
(类似命令 grep -v
# grep -v "^$" abc
booktestbook
book
test)
[root@swallow ~]# sed '1d' abc (删除第一行)
book
test
[root@swallow ~]# sed '1,$d' abc ($代表最后一行,删除所有行)
[root@swallow ~]# sed '1,2d' abc (删除第一和第二行)
test
[root@swallow ~]# sed '$d' abc (删除最后一行)
booktestbook
book
[root@swallow ~]# sed '/^b/d' abc (删除以b 开头的行)
test
[root@swallow ~]#
6.已匹配字符串标记 & (\w\+ 匹配每个单词)
# echo hello world | sed 's/\w\+/[&]/'
[hello] world
# echo hello world | sed 's/\w\+/[&]/g' (更加加深了对g 使用的了解)
[hello] [world]
所有以192.168.1.120开头的都替换成自己加:localhost
这里以nginx的访问日中为例:
# sed 's/^192.168.1.120/&:localhost/g' /application/nginx/logs/20170202_access_www.log | awk '{print $1}'|grep 120
192.168.1.120:localhost
awk '{print $1}' 是提取出第一列 grep 120 找到 192.168.1.120
7.子串匹配标记 \1
# echo BBB bbb | sed 's/\([A-Z]\+\) \([a-z]\+\)/\2 \1/'
bbb BBB
# echo loveable | sed 's/\(love\)able/\1evol/'
loveevol
8.选定行的范围"," 在行上插入 i\ 在行下追加 a\ 替换本行 c\
# sed '/^book/,/^test/i\abc' abc (在以book和test开头的行上面写入abc)
abc
booktestbook
abc
book
abc
abc
test
# sed '/^book/,/^test/a\abc' abc (在以book和test开头的行下面写入abc)
booktestbook
abc
book
abc
abc
test
abc
# sed -e '/^$/d' abc -e '/test/ c \give'
give
book
give
9.多点编辑 命令 e
# sed -e '/^$/d' -e 's/book/BOOK/g' abc
BOOKtestBOOK
BOOK
test
10.下一个 n 命令: (如果book被匹配,则移动到匹配行的下一个将book替换成bookabc
# sed '/book/{n; s/\([a-z]\+\)/\1abc/;}' abc
booktestbook
bookabc
test
11.写入文件 w 命令 和 读取文件 r 命令
将abc中的包含book的行写入到 book
# sed '/book/w book' abc
booktestbook
book
test
查看文件book 和abc
# cat book
booktestbook
book
# cat abc
booktestbook
book
test
逐行读取文件book中含有book的字符的行。如果abc中也含有book并且行号一样,则显示在后面
# sed '/book/r book' abc
booktestbook
booktestbook
book
book
booktestbook
book
test
12.退出 q
# sed '2q' abc
打印出第二行后退出。
简单应用:
打印奇数行和偶数行
# echo -e "1\n2\n3\n4">pn
# sed -n 'p;n' pn
1
3
# sed -n '1~2p' pn
1
3
# seq 6 | sed 'n;d'
1
3
5
# seq 6 | sed -n 'N;P'
1
3
5
# sed -n 'n;p' pn
2
4
# sed -n '2~2p' pn
2
4
# seq 6 | sed -n 'n;p'
2
4
6
打印总行号( = 代表行号)
# cat abc | sed -n '$='
4
只打印最后一行:
# seq 6 | sed -n '$p'
6
位置调换:
# echo '123#abc!def*456' | sed -r 's/([^#]+)(!.*\*)([^\*]+$)/\3\2\1/'
123#456!def*abc
分行添加标记技巧
# seq 6 | sed ':a;N;s/\n/#/;b a'
1#2#3#4#5#6
# sed ':a;N;s/\n/@/; b a' abc
booktestbook@book@@test