分类: LINUX
2009-05-14 13:27:26
1. ``=$()
2. $(()) 数学运算
3. [ -a ] = [[ && ]]
4. [ -o ] = [[ || ]]
5. 判断a变量是否包含b变量?
方法1:echo $a | grep $b
方法2:expr index "$a" "$b"
6. not awk '{max=1}{print '$max'}' but awk '{max=1}{print max}'
awk自定义的变量不需要在前面加$
7. 查看第n行的上下几行 grep -A 2 "d" text
-A 2 表示匹配行和下面的2行
-B 2 表示匹配行和上面的2行
-C 2 表示匹配行和上面及下面的2行
8. 匹配运算符":" $ a=123456
$ expr $a : "12.*" 结果为6
9. 查看Apache的并发请求数及其TCP连接状态:
$ netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
10. xargs -n3 < a.txt 表示 每行按3个字段显示
xargs只支持标准输入,不支持文件,不能用xargs -n3 a.txt
11. awk '{print $'"$A"'}' 1.txt 引号就近匹配, 等于:
awk '{print $' "$A" '}' 1.txt
12. awk 常用变量:
FNR 当前记录数
NF 当前记录中的字段个数
NR 已经读出的记录数
OFS 输出字段分隔符 空格
ORS 输出的记录分隔符 新行
FS 输入字段分隔符
RS 输入的记录分隔符 新行
13. grep -o 选项只显示匹配的内容
14. bash 帮助查看 LANG=C PAGER='less -iRsp[查询内容]' man bash
15.如果某行的第一个字符为空,就把这一行补到上一行,中间用空格或TAB键隔开
示例文件如下
a
b
c
d
实现:awk -v RS="###" '{gsub("\n[ \t]+","\t");print}' URFILE
解释:ps: -v 开始定义变量RS="###" ,这个目的是把全文当作一条记录。
gsub("\n[ \t]+","\t") 全局替换函数,把 \n加一个或多个空格或者是\n加一个或多个\t 替换成\t
print 处理之后打印
16.apache日志文件 /log 里的日志格式如下
115.31.12.33 [24/Mar/2009:14:38:16+0800] "GET/search?q=xeon HTTP/1.1" 200 10623
116.18.84.12 [24/Mar/2009:14:41:25+0800] "GET/search?q=NERO8 HTTP/1.1" 200 20799
1. 统计一天内的总搜索量?
2. 统计一天内不同样的查询词,并显示被查询的次数最多的是哪个词?
3. 一天内访问IP数(不同样)最多的某一分钟是哪一分钟?
1 统计一天内的总搜索量?
awk -F"[:[]" '{a[$2]++}END{for(i in a) print i"\t"a[i]}' LOGFILE
2.1 统计一天内不同样的查询词
awk -F"[= :[]" '{a[$3"\t"$8]++}END{for(i in a) print i"\t"a[i]}' LOGFILE
2.2 显示被查询的次数最多的是哪个词
awk -F"[= :[]" '{a[$3"\t"$8]++}END{for(i in a) print i"\t"a[i]}' LOGFILE | sort -k1,1 -k3,3nr | uniq -w 11
3 一天内访问IP数(不同样)最多的某一分钟是哪一分钟
awk -F"[= :[]" '{s=$1"\t"$3"\t"$4":"$5;if(!b[s]){a[$3"\t"$4":"$5]++;b[s]++}}END{for(i in a) print i"\t"a[i]}' LOGFILE | sort -k1,1 -k3,3nr | uniq -w 11
17.使用awk过虑重复的行: awk '!a[$0]++' file = awk 'a[$0]++==0' file
首次出现时a[$0]为空,!a[$0]返回真,然后a[$0]++,第二次出现时,a[$0] 为1,!a[$0]返回假,然后a[$0]++。。。。
18.find . -maxdepth 2 | xargs -n1 du -sm
如果如果目录当中有空格,例如'a a',就会出现du a a 。
find . -maxdepth 2 | xargs -i -n1 du -sm "{}"
-i 是将输出的文件名放到{}中,-n1表示每行按一个字段显示。
19. 读取{}之间的内容 test内容如下:
{
1
}
{
2
}
awk '$1 ~/{/ {while (getline line) {if(line ~/}/) {break};print line}}' test
1
2
20.在crontab中%字符被认为是换行,所以你的命令中有%时,在crontab中要加\转义
30 * * * * date '+%D' >datefile
是错误的
正确的应该是
30 * * * * date '+\%D' >datefile
21.显示几天之前的日期