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

 

posted @ 2014-11-10 14:32  1317660800  阅读(841)  评论(0)    收藏  举报