shell常用命令(sort、grep、date、uniq、awk)
1、按照文件的第二列进行排序
sort -n -k2 a.txt 或 sort -g -k2 a.txt(从小到大排序)
sort -r -k2 a.txt(从大到小排序)
-n, --numeric-sort -g, --general-numeric-sort
-r, --reverse 逆序输出排序结果
-t, --field-separator=分隔符 使用指定的分隔符代替非空格到空格的转换
-k, --key=KEYDEF sort via a key; KEYDEF gives location and type,指定排序列数
sort -t $'\t' -k1 -k2 t.log ,指定分隔符为\t, 先按照第一列排序,第一列相同的按照第二列排序
2、搜索一个文件中是否含有指定关键字,并输出含有关键字的行号
grep -n 'a' a.text
-n:显示匹配行及行号
-c:只输出匹配行的计数
-h:查询多文件时不显示文件名。
-l:查询多文件时只输出包含匹配字符的文件名。
-v, --invert-match(反向匹配) select non-matching line(选择不匹配的行) 举例:grep -v "^$" filename 去除文件中的空行即筛选文件中的非空行
-bash-4.1$ cat 1 10.0.0.41 - - [03/Dec/2010:23:27:01 +0800] "HEAD /ch.jsp HTTP/1.0" 200 - 10.0.0.43 - - [03/Dec/2010:23:27:01 +0800] "HEAD /cg.jsp HTTP/1.0" 200 - 10.0.0.42 - - [03/Dec/2010:23:27:01 +0800] "HEAD /test.jsp HTTP/1.0" 200 - 10.0.0.46 - - [03/Dec/2010:23:27:02 +0800] "HEAD /s.jsp HTTP/1.0" 200 - 10.0.0.42 - - [03/Dec/2010:23:27:02 +0800] "HEAD /a.do HTTP/1.0" 200 - 10.0.0.47 - - [03/Dec/2010:23:27:02 +0800] "HEAD /b.html HTTP/1.0" 200 - 10.0.0.47 - - [03/Dec/2010:23:27:02 +0800] "HEAD /csj.jsp HTTP/1.0" 200 - 10.0.0.47 - - [03/Dec/2010:23:27:02 +0800] "HEAD /jsa.jsp HTTP/1.0" 200 - 10.0.0.41 - - [03/Dec/2010:23:27:03 +0800] "HEAD /do.jsp HTTP/1.0" 200 - 10.0.0.46 - - [03/Dec/2010:23:27:03 +0800] "HEAD /checkstatus.jsp HTTP/1.0" 200 - -bash-4.1$ grep -v "^$" 1 10.0.0.41 - - [03/Dec/2010:23:27:01 +0800] "HEAD /ch.jsp HTTP/1.0" 200 - 10.0.0.43 - - [03/Dec/2010:23:27:01 +0800] "HEAD /cg.jsp HTTP/1.0" 200 - 10.0.0.42 - - [03/Dec/2010:23:27:01 +0800] "HEAD /test.jsp HTTP/1.0" 200 - 10.0.0.46 - - [03/Dec/2010:23:27:02 +0800] "HEAD /s.jsp HTTP/1.0" 200 - 10.0.0.42 - - [03/Dec/2010:23:27:02 +0800] "HEAD /a.do HTTP/1.0" 200 - 10.0.0.47 - - [03/Dec/2010:23:27:02 +0800] "HEAD /b.html HTTP/1.0" 200 - 10.0.0.47 - - [03/Dec/2010:23:27:02 +0800] "HEAD /csj.jsp HTTP/1.0" 200 - 10.0.0.47 - - [03/Dec/2010:23:27:02 +0800] "HEAD /jsa.jsp HTTP/1.0" 200 - 10.0.0.41 - - [03/Dec/2010:23:27:03 +0800] "HEAD /do.jsp HTTP/1.0" 200 - 10.0.0.46 - - [03/Dec/2010:23:27:03 +0800] "HEAD /checkstatus.jsp HTTP/1.0" 200 - -bash-4.1$
3、输出当前时间
date -d now +%Y-%m-%d\ %H:%I:%S
2014-11-10 15:03:40
date -d "+1 month" +%Y-%m-%d 2014-12-10 date -d "-2 month" +%Y-%m-%d 2014-9-10 date -d "+2 day" +%Y-%m-%d 2014-11-12
4、显示文件中不重复的行
uniq -u a.text
显示重复行
uniq -d a.log
显示文件每一行出现次数.(注意只有相邻重复的行才会重复行,计数才会+1...)
uniq -c a.log
5、awk
awk 'BEGIN{str_tmp="it is a test";split(str_tmp,str_arr," ");for(k in str_arr){print k,str_arr[k];}}'
#split是awk一个内置函数split(str_tmp,str_arr," ")操作之后会把 str_tmp变量按照空格分隔存储在数组str_arr中
#注意:splite截取的数组下标从1开始。
(1)匹配操作符(~)
显示文件中第一列以d开头的行
awk '$1 ~/^d/' a.text
其中$1为第一列
显示文件中第二列不是9开头的行
awk '$2 !~/^9/' a.text
(2)输出文件中所有行号和内容
awk '{print NR,$0}' a.text
awk把每一个以换行符结束的行称为一个记录。
$0变量:它指的是整条记录。
变量NR:一个计数器,每处理完一条记录,NR的值就增加1
(3)查看系统ip地址,只需要ip地址
ifconfig|egrep "inet addr"|awk '{print $2}'|awk -F ":" '{print $2}'
命令选项:-F fs 或者 --field-separator fs :指定输入文件折分隔符,fs是一个字符串或者是一个正则表达式,如-F ":"
6、内置函数length()
awk '{len=length($0); print len}' a.text
7、统计apache日志单ip连接数排名
10.0.0.41 - - [03/Dec/2010:23:27:01 +0800] "HEAD /ch.jsp HTTP/1.0" 200 - 10.0.0.43 - - [03/Dec/2010:23:27:01 +0800] "HEAD /cg.jsp HTTP/1.0" 200 - 10.0.0.42 - - [03/Dec/2010:23:27:01 +0800] "HEAD /test.jsp HTTP/1.0" 200 - 10.0.0.46 - - [03/Dec/2010:23:27:02 +0800] "HEAD /s.jsp HTTP/1.0" 200 - 10.0.0.42 - - [03/Dec/2010:23:27:02 +0800] "HEAD /a.do HTTP/1.0" 200 - 10.0.0.47 - - [03/Dec/2010:23:27:02 +0800] "HEAD /b.html HTTP/1.0" 200 - 10.0.0.47 - - [03/Dec/2010:23:27:02 +0800] "HEAD /csj.jsp HTTP/1.0" 200 - 10.0.0.47 - - [03/Dec/2010:23:27:02 +0800] "HEAD /jsa.jsp HTTP/1.0" 200 - 10.0.0.41 - - [03/Dec/2010:23:27:03 +0800] "HEAD /do.jsp HTTP/1.0" 200 - 10.0.0.46 - - [03/Dec/2010:23:27:03 +0800] "HEAD /checkstatus.jsp HTTP/1.0" 200 -
awk '{print $1}' apache.log|sort |uniq -c |sort -rn|head -10
awk '{print $1}' apache.log 取出第一列
awk '{print $1}' apache.log|sort 取出第一列并根据ip排序
awk '{print $1}' apache.log|sort |uniq -c | 取出第一列并根据ip排序,获取每个的ip重复数(uniq -c只会计算相邻的重复数,所以先排序)
awk '{print $1}' apache.log|sort |uniq -c |sort -rn| 获取重复数后,倒序排
...|head -10 获取前10行
8、xargs 是一个强有力的命令,它能够捕获一个命令的输出,然后传递给另外一个命令
获得/etc/ 下所有*.conf 结尾的文件列表:
find /etc -name "*.conf" | xargs ls –l
PS:a.txt文件内容
a 1
c 3
d 5
g 2
d 9
d 9
z 4
d 9
浙公网安备 33010602011771号