本文共 4232 字,大约阅读时间需要 14 分钟。
写一个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