起步于308的小菜菜

no money no dream coder 一枚

Python and Beautiful Soup to Html

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
今天有这个需求,需要去拉站点的html的文件然后解析想要的几个内容.
pycurl: http://pycurl.sourceforge.net/doc/index.html
BeautifulSoup: http://www.crummy.com/software/BeautifulSoup/bs4/doc/
这两个py modules应用的时候可以在ipython试探性的使用查看某个属性和某个函数,help更直白
在此做个小笔记作今天的学习笔记.
代码有点小戳呀。。嘿嘿

py code
#!/usr/bin/env python
# -*- coding:utf-8 -*-

'''
Author:mdk
Email:mengdaikun@gmail.com
Date:2014-8-29
py解析html
'''

import pycurl
import StringIO
from bs4 import BeautifuSoup

#get html file from xxx.com
def get_html():
    url = 'http://xxx.com'
    ret = pycurl.Curl()
    ret.setopt(ret.URL,url)
    temp = StringIO.StringIO()
    ret.setopt(ret.WRITEFUNCTION,temp1.write)
    ret.setopt(ret.FOLLOWLOCATION,1)
    ret.setopt(ret.HEADER,True)
    ret.perform()
    html = temp.getvalue()
    temp.close()
    ret.close()
    return html

def get_url():
    html = get_html()
    soup = BeautifulSoup(html)
    urls = soup.find("ul",id="cui_nav_ul")#查找ul id=cui_nav_ul的body内容

    for i in urls.find_all('a'): #查找所有a标签
        if i.get('id'): #a标签下的id内容
            if 'c_ph' in i.get('id'): #id的内容含c_ph
                try:
                    print i.get('title').strip(),i.get('href').strip()
                except:
                    pass

if __name__ == '__main__':
    get_url()

欢迎加入群里讨论相关技术 群号: 250244637

Heartbeat

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
最近做了个heartbeat的资源监控脚本测试,当master的资源不可用时,heartbeat standby 资源转移
当节点1的http状态嘛不等于200时,heartbeat资源转移(standby)
#!/bin/bash - 
#===============================================================================
#
#          FILE: check_srv_status.sh
# 
#         USAGE: ./check_srv_status.sh 
# 
#   DESCRIPTION: 检查srv的状态 如果srv不可用heartbeat vip转换
# 
#       OPTIONS: ---
#  REQUIREMENTS: ---
#          BUGS: ---
#         NOTES: ---
#        AUTHOR: mengdaikun (), 
#  ORGANIZATION: 
#       CREATED: 01/26/2014 09:38:28 PM CST
#      REVISION:  ---
#===============================================================================
set -o nounset                              # Treat unset variables as an error

srv="http://192.168.6.107"

HTTP_CODE=`curl -o /dev/null -s -w "%{http_code}" "${srv}"`

[ -f /var/log/mdk ] && echo "The file has." || touch /var/log/mdk

function_ha_standby(){
    /etc/init.d/heartbeat standby >> /var/log/mdk
    echo  `date +"%Y-%m-%d  %H:%M:%S"`  httpd switched to slave!  >> /var/log/mdk
    /etc/init.d/heartbeat start >> /var/log/mdk
    /etc/init.d/httpd start >> /var/log/mdk
}

/sbin/ifconfig | grep eth0:0 >/dev/null 2>&1

if [[ $? -eq 0 ]];then
   if [[ $HTTP_CODE -ne 200 ]];then
        echo  `date +"%Y-%m-%d  %H:%M:%S"`  httpd haved stop>> /var/log/mdk
        echo "mdk"
  function_ha_standby
   fi
fi

来迟的2013年度总结

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
2013是我不平凡的一年,这年是python年,我这一年里也因为python收获了很多。
过去的一年读过的书有:
1、《看见》
2、《黑客与画家》
3、《浪潮之巅》
4、《淘宝这十年》 (断断续续读了前几章)
就读了这几本书。

技术上:
1、之前小打小闹看过不少python的技术书籍。暑假七八月份的时候,在一家创业型
的公司实习,做的是服务器端的开发(也就是比较流行的虚拟云应用的开发),开发语言
是python,IDE是Wing IDE。一个月多的时间下来,读了一遍源代码,修改了小模块(re模
块的使用?其实最后发现用字符串就能解决),添加个小功能(python接收管理平台发来的
消息进行app的install和uninstall),九月份回学校的时候写了份自己服务端的文档。我负
责的服务端有linux和windows端,linux端直接把py代码扔到/etc/init.d/下跑守护进程,
windows端需要把py代码编译为exe文件作为service启动。那一段时间的确挺开心的,学了不
少知识,用python操作注册表,py2exe,py的win32 modules etc..
2、十月校招季过后,进入国内一家一线的互联网公司。十一份的时候入职报到。从入职
知道现在,这一段时间里,学了更多的东西,将最当初自己抛弃的Django学习并应用了。学习
了四月多时就传闻的zabbix,最早听说自动化利器puppet,又有py写的salt,salt的安装与配置
相当简单,个人认为,当初自己捣鼓puppet的时候,光ruby就快把人整死了。DevOps要求从前
到后都要操刀,这或许就是其比较火的原因吧。总之到目前为止,学了很多,收益匪浅。感谢
老大(老大是很nice的人,接我入职的时候给我讲了好多实用的东西,相当的nice),感谢师
傅。感谢一起陪伴的小伙伴们!

生活:
还是比较宅。做的饭越来越好吃。不好的是自己偶尔吸根烟。保持尽量能不喝酒就不喝。
一步一步积累经验吧。

学习:
Learn() and Work()

产望:
七月毕业奋斗。
2014 已经完成初始化。
2014进行中。。。。

python崇尚简洁。当然这总结还简洁吧

                                                                                          --by 技术渣渣mdk

Fighting~~

1
2
3
4
5
一年一度的武林大会开始了~各路豪杰各路群雄~高手如林
渣渣要继续苦逼ing
来吧来吧
痛痛快快的玩个遍
渣渣的大刀已经准备好了

从未提及的秘密

当我在vim中敲下这一段文字的时候~说明我已经放下了~6月26日上午11点50来分吧,坐上了去往萧山南站的328公交.两年了

杭州的确发生了很多变化~328快开的时候~有一男生走下车向站台上的一位女生索要电话号码~女生或许被突如其来的举动惊呆了 先扭过头去~然后捂着嘴巴估计笑(偷着乐吧)..男生依旧向女生举着手机~这时328关上了门~徐徐着要开了~男生发现猛的收回手 机~拍着车门要司机开门~车上的人看着这一幕都笑了~那个女生这回是真笑了~看着这一幕在自己眼皮底下发生了~我觉得有点好笑 ~佩服那位男生的勇气~自己也忘了当初是怎么要到你的联系方式的~这或许就是讽刺吧~

一路的风景无暇顾及~你发短信问我:下大雨了,你还来吗?我说会来的~已经在车上了~马上就到南站~到南站的时候~雨似乎

下得更大了~自己一路上想着这两年多来的时间~去年自己忽悠你我能你给装个MAC玩玩~结果把联想机上的windows删了~给你装上了 Macubutun~你看到的时候很欢乐~后来你发现上不了闪讯闹着要回windows~我无奈给你装了个virbox里面装个win与Macubutun来 NAT~再接着又装了pps~qq~等等~当然最后还是给你装了双系统~后来每每提起这件事都会被你臭骂一顿的~记得你无数次的向我表明 你的PS有多高超~每次我都得点头认可~时间就这样的过来了

来到南站雨依旧没有减小的趋势~雨中的南站~出站口的人熙熙攘攘~进站口的人徐徐拖着行李箱~我看到了站在风雨中撑着小伞

的你~159.5的身高~硬要穿着高跟~消瘦得风能把你吹走~下午两点多的时候我送你进候车大厅~进去前我问你东西都带全了吗?你说 我有点啰嗦~我愣愣一笑~你拖着行李箱进去了~快进门的时候你回头看看了在雨中的我~然后扭过头去进了候车大厅排队上车..剩下 在雨中不知所措的我~

两年多的时间~我们彼此都给了彼此很大的空间~你很少挖我的隐私~你给我更多的似乎是包容~现在想想自己多少有点自私了~

自己大部分时间宅实验室而且嘴笨不会怎么哄人开心~三点多的时候你发来短信说短信车快开了~我:嗯嗯的回复~火车咣咣的开了 前往你offer的所在地也是你的老家—无锡~留我一个人在雨中萧条的站着~杭州南站七月要封了~我们的站点不同了很讽刺的意义~

人生是单向道~两个人的人生轨道有同向的时候~但也有岔开的时候~同向时的美好时光就是最好的收获~人生旅途依旧~只是站点

不同了~回忆是我们在一起过~~

个人简历

板砖请轻拍

(个人简历.cpp) download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
/*
 * =====================================================================================
 *
 *       Filename:  个人简历.cpp
 *
 *    Description:  个人简历
 *
 *        Version:  1.0
 *        Created:  2013-6-08 18:54:05
 *       Revision:  none 
 *            BUG:  no init for class myself(because .....)
 *       Compiler:  gcc
 *
 *         Author:  ACman mdk (Orz Linux Sir Koma linyu zhujiajun), mdk@server.example.com
 *        Company:  ACM 309 JudgeOnline
 *
 * =====================================================================================
 */
#include<iostream>
#include<string>
#include<cstdio>
#include<cstdlib>
#include<vector>
#include<list>
#include<map>
#include<stack>
#include<algorithm>
using namespace std;

class myself{
  
  public:
  string name;
  string email1;
  string email2;
  string phone;
  vector<string> skills;
  map<string, string> other_table;
  
  public:
  void education()
  {
      printf("%s在校本科生\n","中国计量学院");
      printf("毕业时间%s\n","2014-6");
  }
  
  void skills_now(){
      skills.push_back("unix/linux");
      skills.push_back("shell");
      skills.push_back("c/c++");
      skills.push_back("python");
  }

  void other_info(){
      other_table["IDE"] = "vim  && ssh";
      other_table["socket"] = "TCP/IP";
      other_table["DB"] = "mysql&some oracle";
      other_table["project"] = "OJ(Judge Online) && vsftpd";
      other_table["architecture"] = "lamp && lnmp";
  }
  
};

bool interested_in_me()
{
  return true;
}

bool want_to_Computer_repair()
{
  return false;
}
int main(void)
{
  printf("hello world,this is my Resume\n");
  
  myself mdk ;

  mdk.name = "蒙代坤";
  mdk.email1 = "mengdaikun@gmail.com";
  mdk.email2 = "646978600@qq.com";
  mdk.phone = "18767161672";
  

  string first_choice = "Systems Engineer";
  string second_choice = "linux SA";
  string third_choice = "software Engineer";

  if(interested_in_me)
  {
      cout<<"This is my phone number: %s"<<mdk.phone<<endl;
      cout<<"This is my email1: %s"<<mdk.email1<<endl;
      cout<<"This is my email2: %s"<<mdk.email2<<endl;
  }
  else if(want_to_Computer_repair)
  {
      printf("oh,sorry\n");
  }
  else
  {
      printf("Thank you!!nice to meet you \n");
  }
  return 0;
}

Shell Nginx日志处理1

利用shell 脚本分析 Nginx负载均衡器

(deal_nginx_log1.sh) download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
#!/bin/bash - 
#===============================================================================
#
#          FILE: deal_nginx_log1.sh
# 
#         USAGE: ./deal_nginx_log1.sh 
# 
#   DESCRIPTION: shell 分析处理 nginx 日志 构建高可用linux服务器 nginx 作为最前端的负载均衡器 
# 
#       OPTIONS: ---
#  REQUIREMENTS: ---
#          BUGS: ---
#         NOTES: ---
#        AUTHOR: mengdaikun (), 
#  ORGANIZATION: 
#       CREATED: 06/04/13 12:24:07 CST
#      REVISION:  ---
#===============================================================================

set -o nounset                              # Treat unset variables as an error

if [ $# -eq 0 ]
then
  echo "Error:please specify logfile."
  exit 0
else
  LOG=$1
fi

if [ ! -f $1 ]
then
  echo "Sorry,sir,I can't find yhis apache log file,please try again!"
  exit 0
fi

###############################################################################
echo "Most of the ip:"
echo "------------------------------------------------------------------------"
awk '{print $1}' $LOG | sort | uniq -c | sort -nr | head -10
echo
echo

###############################################################################
echo "Most of the time:"
echo "-------------------------------------------------------------------------"
awk '{print $4}' $LOG | cut -c 14-18 | sort | uniq -c | sort -rn | head -10
echo
echo
###############################################################################
echo "Most of the page"
echo "--------------------------------------------------------------------------"
awk '{print $11}' $LOG | sed 's/^.*\\(.cn*\\)\"/\\1/g' | sort | uniq -c | sort -nr | head -10
echo 
echo
###############################################################################
echo "Most of the time / Most of the ip:"
echo "--------------------------------------------------------------------------"
awk '{print $4}' $LOG | cut -c 14-18 | sort -n | uniq -c | sort -rn | head -10 > timelog

for i in `awk '{print $2}' timelog`
do
  num=`grep $i timelog | awk '{print $1}'`
  echo "$i $num"
  ip=`grep $i $LOG | awk '{print $1}' | sort -n | uniq -c | sort -rn | head -10`
  echo "$ip"
  echo
done

rm -rf timelog

Nginx 作为WebServer

(deal_nginx_log2.sh) download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
#!/bin/bash  
#===============================================================================
#
#          FILE: deal_nginx_log1.sh
# 
#         USAGE: ./deal_nginx_log1.sh 
# 
#   DESCRIPTION: shell 分析处理 nginx 日志 构建高可用linux服务器 nginx 作为Web端 ,这时要踢出LVS的ip地址 
# 
#       OPTIONS: ---
#  REQUIREMENTS: ---
#          BUGS: ---
#         NOTES: ---
#        AUTHOR: mengdaikun (), 
#  ORGANIZATION: 
#       CREATED: 06/04/13 12:24:07 CST
#      REVISION:  ---
#===============================================================================

set -o nounset                              # Treat unset variables as an error

if [ $# -eq 0 ]
then
  echo "Error:please specify logfile."
  exit 0
else
  cat $1 | grep -v "$LVS_ip" > LOG
fi

if [ ! -f $1 ]
then
  echo "Sorry,sir,I can't find yhis apache log file,please try again!"
  exit 0
fi

###############################################################################
echo "Most of the ip:"
echo "------------------------------------------------------------------------"
awk '{print $1}' LOG | sort | uniq -c | sort -nr | head -10
echo
echo

###############################################################################
echo "Most of the time:"
echo "-------------------------------------------------------------------------"
awk '{print $4}' LOG | cut -c 14-18 | sort | uniq -c | sort -rn | head -10
echo
echo
###############################################################################
echo "Most of the page"
echo "--------------------------------------------------------------------------"
awk '{print $11}' LOG | sed 's/^.*\\(.cn*\\)\"/\\1/g' | sort | uniq -c | sort -nr | head -10
echo 
echo
###############################################################################
echo "Most of the time / Most of the ip:"
echo "--------------------------------------------------------------------------"
awk '{print $4}' LOG | cut -c 14-18 | sort -n | uniq -c | sort -rn | head -10 > timelog

for i in `awk '{print $2}' timelog`
do
  num=`grep $i timelog | awk '{print $1}'`
  echo "$i $num"
  ip=`grep $i LOG | awk '{print $1}' | sort -n | uniq -c | sort -rn | head -10`
  echo "$ip"
  echo
done

rm -rf timelog

系统监控shell函数库

系统监控函数库~调用相应的函数即../function.inc 完善相应的shell代码即可

(function.sh) download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
#*=============================================================================
#
# Author: mengdaiku - mengdaikun@gmail.com
#
# QQ : 646978600
#
# Last modified: 2013-05-26 22:19
#
# Filename: function.inc
#
# Description: 系统监控shell函数库调用(../function.inc) 收集来自互联网
#
#=============================================================================
function GetPID #PsUser #PsName
{
    PsUser=$1
    PsName=$2
    pid=`ps -u $PsUser|grep $PsName|grep -v grep|grep -v vi|grep -v dbx|grep -v tail|grep -v start|grep -v stop |sed -n 1p |awk '{print $1}'`
    echo $pid
}

function GetCpu
{
    CpuValue=`ps -p $1 -o pcpu |grep -v CPU | awk '{print $1}' | awk -F. '{print $1}'`
    echo $CpuValue
}

function CheckCpu
{
    cpu=`GetCpu $1`

    echo "The CPU is $cpu"

    if [ "-$cpu" == "-" ]
    then
    {
        echo "The process is not found"
        return 1;
    }
    fi

    if [ $cpu -gt 80 ]
    then
    {
        echo "The usage of cpu is larger than 80%"
    }
    else
    {
        echo "The usage of cpu is normal"
    }
    fi
}

function GetMem
{
    MEMUsage=`ps -o vsz -p $1|grep -v VSZ`
    (( MEMUsage /= 1000))
    echo $MEMUsage
}

function GetDes
{
    DES=`ls /proc/$1/fd | wc -l`
    echo $DES
}

function GetSysCPU
{
   CpuIdle=`vmstat 1 5 |sed -n '3,$p' |awk '{x = x + $15} END {print x/5}' |awk -F. '{print $1}'`
   CpuNum=`echo "100-$CpuIdle" | bc`
   echo $CpuNum
}

function Listening
{
    TCPListeningnum=`netstat -an | grep ":$1 " | awk '$1 == "tcp" && $NF == "LISTEN" {print $0}' | wc -l`
    UDPListeningnum=`netstat -an|grep ":$1 " |awk '$1 == "udp" && $NF == "0.0.0.0:*" {print $0}' | wc -l`
    (( Listeningnum = TCPListeningnum + UDPListeningnum ))
    if [ $Listeningnum == 0 ]
    then
    {
        echo "0"
    }
    else
    {
       echo "1"
    }
    fi
}

function GetDiskSpc
{
    if [ $# -ne 1 ]
    then
        return 1
    fi

    Folder="$1$"
    DiskSpace=`df -k |grep $Folder |awk '{print $5}' |awk -F% '{print $1}'`
    echo $DiskSpace
}

function Chech_Tcp_Server_Port_Stat
{
    count_result=0
    stat_num=`netstat -an|egrep $1 |awk '$6 == "LISTEN" && $1 == "tcp" {print $0}' |wc -l`
    if [ $stat_num -ge 1 ]
    then
    {
        count_result=0
        echo "$1 port is normal!"
    }
    else
    {
        echo "$1 port is abnormal, please check"
    }
    fi
    return 0
}

Fork经典问题

经典问题1,会输出多少?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include<stdio.h>
#include<sys/types.h>
#include<unistd.h>

int main()
{
  int i;
  for(i = 0 ; i < 2 ; i++)
  {
      fork();
      printf("-");
  }
  return 0;
}

经典问题2,会输出多少?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include<stdio.h>
#include<sys/types.h>
#include<unistd.h>

int main()
{
  int i;
  for(i = 0 ; i < 2 ; i++)
  {
      fork();
      printf("-\n");
      fflush(stdout);
  }
  return 0;
}

Awk技巧

awk用法和技巧小结

(awk) download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
awk 用法:awk ' pattern {action} '

变量名 含义
ARGC 命令行变元个数
ARGV 命令行变元数组
FILENAME 当前输入文件名
FNR 当前文件中的记录号
FS 输入域分隔符,默认为一个空格
RS 输入记录分隔符
NF 当前记录里域个数
NR 到目前为止记录数
OFS 输出域分隔符
ORS 输出记录分隔符

1awk '/101/' file 显示文件file中包含101的匹配行。
awk '/101/,/105/' file
awk '$1 == 5' file
awk '$1 == "CT"' file 注意必须带双引号
awk '$1 * $2 >100 ' file
awk '$2 >5 && $2<=15' file
2awk '{print NR,NF,$1,$NF,}' file 显示文件file的当前记录号、域数和每一行的第一个和最后一个域。
awk '/101/ {print $1,$2 + 10}' file 显示文件file的匹配行的第一、二个域加10
awk '/101/ {print $1$2}' file
awk '/101/ {print $1 $2}' file 显示文件file的匹配行的第一、二个域,但显示时域中间没有分隔符。
3df | awk '$4>1000000 ' 通过管道符获得输入,如:显示第4个域满足条件的行。
4awk -F "|" '{print $1}' file 按照新的分隔符“|”进行操作。
awk 'BEGIN { FS="[: \t|]" }
{print $1,$2,$3}' file 通过设置输入分隔符(FS="[: \t|]")修改输入分隔符。

Sep="|"
awk -F $Sep '{print $1}' file 按照环境变量Sep的值做为分隔符。
awk -F '[ :\t|]' '{print $1}' file 按照正则表达式的值做为分隔符,这里代表空格、:TAB|同时做为分隔符。
awk -F '[][]' '{print $1}' file 按照正则表达式的值做为分隔符,这里代表[]
5awk -f awkfile file 通过文件awkfile的内容依次进行控制。
cat awkfile
/101/{print "\047 Hello! \047"} --遇到匹配行以后打印 ' Hello! '.\047代表单引号。
{print $1,$2} --因为没有模式控制,打印每一行的前两个域。
6awk '$1 ~ /101/ {print $1}' file 显示文件中第一个域匹配101的行(记录)。
7awk 'BEGIN { OFS="%"}
{print $1,$2}' file 通过设置输出分隔符(OFS="%")修改输出格式。
8awk 'BEGIN { max=100 ;print "max=" max} BEGIN 表示在处理任意行之前进行的操作。
{max=($1 >max ?$1:max); print $1,"Now max is "max}' file 取得文件第一个域的最大值。
(表达式1?表达式2:表达式3 相当于:
if (表达式1)
表达式2
else
表达式3
awk '{print ($1>4 ? "high "$1: "low "$1)}' file
9awk '$1 * $2 >100 {print $1}' file 显示文件中第一个域匹配101的行(记录)。
10awk '{$1 == 'Chi' {$3 = 'China'; print}' file 找到匹配行后先将第3个域替换后再显示该行(记录)。
awk '{$7 %= 3; print $7}' file 将第7域被3除,并将余数赋给第7域再打印。
11awk '/tom/ {wage=$2+$3; printf wage}' file 找到匹配行后为变量wage赋值并打印该变量。
12awk '/tom/ {count++;}
END {print "tom was found "count" times"}' file END表示在所有输入行处理完后进行处理。
13awk 'gsub(/\$/,"");gsub(/,/,""); cost+=$4;
END {print "The total is $" cost>"filename"}' file gsub函数用空串替换$和,再将结果输出到filename中。
1 2 3 $1,200.00
1 2 3 $2,300.00
1 2 3 $4,000.00

awk '{gsub(/\$/,"");gsub(/,/,"");
if ($4>1000&&$4<2000) c1+=$4;
else if ($4>2000&&$4<3000) c2+=$4;
else if ($4>3000&&$4<4000) c3+=$4;
else c4+=$4; }
END {printf "c1=[%d];c2=[%d];c3=[%d];c4=[%d]\n",c1,c2,c3,c4}"' file
通过ifelse if完成条件语句

awk '{gsub(/\$/,"");gsub(/,/,"");
if ($4>3000&&$4<4000) exit;
else c4+=$4; }
END {printf "c1=[%d];c2=[%d];c3=[%d];c4=[%d]\n",c1,c2,c3,c4}"' file
通过exit在某条件时退出,但是仍执行END操作。
awk '{gsub(/\$/,"");gsub(/,/,"");
if ($4>3000) next;
else c4+=$4; }
END {printf "c4=[%d]\n",c4}"' file
通过next在某条件时跳过该行,对下一行执行操作。


14awk '{ print FILENAME,$0 }' file1 file2 file3>fileall file1file2file3的文件内容全部写到fileall中,格式为
打印文件并前置文件名。
15awk ' $1!=previous { close(previous); previous=$1 }
{print substr($0,index($0," ") +1)>$1}' fileall 把合并后的文件重新分拆为3个文件。并与原文件一致。
16awk 'BEGIN {"date"|getline d; print d}' 通过管道把date的执行结果送给getline,并赋给变量d,然后打印。
17awk 'BEGIN {system("echo \"Input your name:\\c\""); getline d;print "\nYour name is",d,"\b!\n"}'
通过getline命令交互输入name,并显示出来。
awk 'BEGIN {FS=":"; while(getline< "/etc/passwd" >0) { if($1~"050[0-9]_") print $1}}'
打印/etc/passwd文件中用户名包含050x_的用户名。

18awk '{ i=1;while(i awk '{ for(i=1;i type file|awk -F "/" '
{ for(i=1;i { if(i==NF-1) { printf "%s",$i }
else { printf "%s/",$i } }}' 显示一个文件的全路径。
forif显示日期
awk 'BEGIN {
for(j=1;j<=12;j++)
{ flag=0;
printf "\n%d月份\n",j;
for(i=1;i<=31;i++)
{
if (j==2&&i>28) flag=1;
if ((j==4||j==6||j==9||j==11)&&i>30) flag=1;
if (flag==0) {printf "%02d%02d ",j,i}
}
}
}'
19、在awk中调用系统变量必须用单引号,如果是双引号,则表示字符串
Flag=abcd
awk '{print '$Flag'}' 结果为abcd
awk '{print "$Flag"}' 结果为$Flag



1、删除重复的行
#awk '!a[]++'

2、将数据文件中的每个词的第一个字母变成大写
cat test
linux is long live!!!
i am a cuer

awk ',1,1); sub(/^./,toupper(first),); print }' test
Linux is long live!!!
I am a cuer

3.awk 范例
a.显示文件第35: awk 'NR==3 || NR ==5 ' /etc/passwd
b.打印前3行和7行以后的: awk 'NR<4 || NR> 7 {print $1}' /etc/passwd
c.打印以rootnobody开始的记录: awk '/^(root|nobody)/' /etc/passwd
d.如果记录以rprp开头,就打印这个记录: awk '/^[rp]/' /etc/passwd
e.显示1-35-7行的信息
#awk '(NR<4 && NR>0) || (NR>4 && NR<8) {print}' /etc/passwd

4.含有root的列
#gawk  'BEGIN{FS=":" ;sum=0} $1 == "root" {sum=sum+1} END {print sum}' passwd

5.把合在一起的数字汉字用空格分开。
#sed 's/^[ ]*//;s/^[0-9]*/& /'  file
#awk '{gsub(/[^0-9]+/,"",$1);print $1}' file

6.统计一列数的总数和平均值。
#awk '{sum +=$2} END{print "sum:" sum}' test.txt
#awk '{sum +=$2} END{print "sum:" sum/NR}' test.txt

7.?指定如果零个或一个字符或扩展正则表达式的具体值在字符串中,则字符串匹配
#awk '/smith?/' file

8.显示包含abc123的字符串
#awk '/abc|123/' file

9.将具有字符串aealleanneallnne的所有记录打印至标准输出
#awk '/a(ll)?(nn)?e/' file

10.{m}指定如果正好有m个模式的具体值位于字符串中,则字符串匹配.下面显示只包含两个l的字符串
#awk  '/l{2}/'  file

11.{m,}指定如果至少m个模式的具体值在字符串中,则字符串匹配,下面显示至少包含两个t的字符串
#awk '/t{2,}/'  file

12.{m, n}指定如果 m  n 之间(包含的 m  n)个模式的具体值在字符串中(其中m<= n),则字符串匹配,下面显示包含12er的字符串
#awk '/er{1,2}/' file

13.将具有zxm后跟以字母顺序从 a  h 排列的任何字符的所有记录打印至标准输出
#awk '/zxm[a-h]/'  file

14.[^String][ ]和在指定字符串开头的^指明正则表达式与方括号内的任何字符不匹配
#awk '/sm[^a-h]/' file


15. ~!~表示指定变量与正则表达式匹配或不匹配的条件语句
#awk  '$1 ~ /n/' file

16.将把字符 h 作为第二个字段的第一个字符和最后一个字符的所有记录打印至标准输出
#awk  '$2 ~ /^h/'  file
#awk  '$2 ~ /h$/'  file


17.将具有以两个字符隔开的字符 a  e 的所有记录打印至标准输出
#awk  '/a..e/' file


18.将具有以零个或更多字符隔开的字符 a  e 打印至标准输出
#awk  '/a*e/' file

19.awk 命令识别大多数用于 C 语言约定中的转义序列,以及 awk 命令本身用作特殊字符的几个转义序列。转义序列是:
    转义序列表示的字符
    \"\"(双引号)
    \//(斜杠)字符
    \ddd其编码由 1、2 或 3 位八进制整数表示的字符,其中 d 表示一个八进制数位
    \\\ (反斜杠) 字符
    \a警告字符
    \b退格字符
    \f换页字符
    \n换行字符
    \r回车字符
    \t跳格字符
    \v垂直跳格


20.要显示长于 72 个字符的文件的行,请输入:
awk 'length($0) >72' file

21.要显示字start和stop之间的所有行,包含“start”和“stop”,请输入:
awk '/start/,/stop/' file

22.在屏幕上打印”What is your name?",并等待用户应答。当一行输入完毕后,getline函数从终端接收该行输入,并把它储存在自定义变量name中。如果第一个域匹配变量name的值,print函数就被执行,END块打印See youname的值
#awk 'BEGIN{printf "What is your name?"; getline name < "/dev/tty" } $1 ~name {print "Found" name on line ", NR "."} END{print "See you," name "."} test

23.awk将逐行读取文件/etc/passwd的内容,在到达文件末尾前,计数器lc一直增加,当到末尾时,打印lc的值
#awk 'BEGIN{while (getline < "/etc/passwd" > 0) lc++; print lc}'

24.system函数可以在awk中执行linux的命令。如:
#awk 'BEGIN{system("clear")'

25.如果第一个域小于第二个域则打印
#awk '{if ($1 <$2) print $2 "too high"}' test

26.变量的初始值为1,若i小于可等于NF(记录中域的个数),则执行打印语句,且i增加1。直到i的值大于NF.
# awk '{ i = 1; while ( i <= NF ) { print NF,$i; i++}}' test
# awk '{for (i = 1; i<NF; i++) print NF,$i}' test

27.将一个文件的总行数显示出来
#gawk '{nlines++} END {print nlines}'  file

28.显示拥有至少一个字段的所有行。这是一个简单的方法,将一个文件里的所有空白行删除
#gawk 'NF > 0'  file

29.此程序会显示出范围是0 到100 之间的7 个随机数
#gawk 'BEGIN {for (i = 1; i <= 7; i++) print int(101 * rand())}'

30.此程序会显示出所有指定的文件的总字节数
#ls -l files | gawk '{x += $4}; END {print "total bytes: " x}'

31.此程序会将指定文件里最长一行的长度显示出来。expand 会将tab 改成space,所以是用实际的右边界来做长度的比较。
#expand file | gawk '{if (x < length()) x = length()} END {print "maximum line length is " x}'


32.显示所有只有四个字符的字段
#awk 'length($1)==4{print $1}'  file


33.显示所有以一个C或E开头的字段
$ awk -F"[: ]" '$1~/^C|E/{print $1}' datafile

34.在文件的第一行前插入一行
#awk 'BEGIN {print "new line"} {print $0}' file >file1

35.在文件末尾添加一行
#awk 'END {print "THE END"} {print $0}' file >file1


36.awk和cut的相同用法
#awk -F: '{print $1,$2,$3}' file
#cut -d: -f2,3,4,5  file
#cut  -c 1-5 /etc/passwd 显示文件中的前1-5个字符

37.以@或:为分隔符的文件
awk -F[@:] '{print $1}' file

38.结果以$分隔
awk 'BEGIN{FS=":"} {OFS="$"} {if($1~/Mike/) print "",$3,$4,$5}' love

39.把一行竖排的数据转换成横排
awk '{printf("%s,",$1)}' a.txt
awk '{printf ("%s\n",$0)}' a.txt

40.systime函数返回从1970年1月1日开始到当前时间(不计闰年)的整秒数
awk '{ now = systime(); print now }'
awk '{ now=strftime( "%D", systime() ); print now }'
awk '{ now=strftime("%m/%d/%y"); print now }'


41.将时间戳转成日值的awk方法
echo "1180051515"|awk '{print strftime("%F %T",$0)}'

42.打印输入记录的最后一个字段
awk -F/ '{print $NF}' a.txt

43.打印输入记录的第2个字段
awk '{x=2;print $x}' a.txt

44.显示文件a.txt的当前记录号、域数和每一行的第一个和最后一个域和文件名
awk '{print NR,NF,$1,$NF,FILENAME}'  a.txt

45.在awk中调用系统变量必须用单引号,如果是双引号,则表示字符串
Flag=abcd
awk ‘{print ‘$Flag’}’ 结果为abcd
awk ‘{print “$Flag”}’ 结果为$Flag

46.把三个文件的内容追加到一个文件里
awk '{print FILENAME,$0}' a b c >all


47.通过管道把date的执行结果送给getline,并赋给变量d,然后打印。
awk 'BEGIN {"date"|getline d; print d}'

48.通过getline命令交互输入name,并显示出来:
#awk 'BEGIN {system("echo \"Input your name:\\c\""); getline d;print "\nYour name is",d,"\b!\n"}'

49.输出不换行
#awk -F: '{printf  $1}'  /etc/passwd 

50.toupper和tolower函数可用于字符串大小间的转换
#awk '{ print toupper("test"), tolower("TEST") }'

51.split函数可按给定的分隔符把字符串分割为一个数组.如果分隔符没提供,按当前FS值进行分割
#awk '{ split( "20:18:00", time, ":" ); print time[2],time[1],time[3] }'

52.sub函数匹配记录中最大,最靠左边的子字符串的正则表达式,并用替换字符串替换这些字符串.如果没有指定目标字符串就默认使用整个记录.替换只发生在第一次匹配的时候.格式如下:
#awk '{ sub(/test/, "mytest"); print }' testfile
#awk '{ sub(/test/, "mytest"); $1}; print }' testfile

53.system函数可以在awk中执行linux的命令。
#awk 'BEGIN{system("clear")}'

54.执行shell的date命令,并通过管道输出给getline,然后getline从管道中读取并将输入赋值给d,split函数把变量d转化成数组mon,然后打印数组mon的第二个元素
#awk 'BEGIN{"date" | getline d; split(d,mon); print mon[2]}' test

 

# 每行后面增加一行空行
awk '1;{print ""}'
awk 'BEGIN{ORS="\n\n"};1'
# 每行后面增加一行空行。输出文件不会包含连续的两个或两个以上的空行
# 注意:在Unix系统, DOS行包括的 CRLF (\r\n) 通常会被作为非空行对待
# 因此 'NF' 将会返回TRUE。
awk 'NF{print $0 "\n"}'
# 每行后面增加两行空行
awk '1;{print "\n"}'
编号和计算:
# 以文件为单位,在每句行前加上编号 (左对齐).
# 使用制表符 (\t) 来代替空格可以有效保护页变的空白。
awk '{print FNR "\t" $0}' files*
# 用制表符 (\t) 给所有文件加上连贯的编号。
awk '{print NR "\t" $0}' files*
# number each line of a file (number on left, right-aligned)
# Double the percent signs if typing from the DOS command prompt.
awk '{printf("%5d : %s\n", NR,$0)}'
# 给非空白行的行加上编号
# 记得Unix对于 \r 的处理的特殊之处。(上面已经提到)
awk 'NF{$0=++a " :" $0};{print}'
awk '{print (NF? ++a " :" :"") $0}'
# 计算行数 (模拟 "wc -l")
awk 'END{print NR}'
# 计算每行每个区域之和
awk '{s=0; for (i=1; i<=NF; i++) s=s+$i; print s}'
# 计算所有行所有区域的总和
awk '{for (i=1; i<=NF; i++) s=s+$i}; END{print s}'
# 打印每行每区域的绝对值
awk '{for (i=1; i<=NF; i++) if ($i < 0) $i = -$i; print }'
awk '{for (i=1; i<=NF; i++) $i = ($i < 0) ? -$i : $i; print }'
# 计算所有行所有区域(词)的个数
awk '{ total = total + NF }; END {print total}' file
# 打印包含 "Beth" 的行数
awk '/Beth/{n++}; END {print n+0}' file
# 打印第一列最大的行
# 并且在行前打印出这个最大的数
awk '$1 > max {max=$1; maxline=$0}; END{ print max, maxline}'
# 打印每行的列数,并在后面跟上此行内容
awk '{ print NF ":" $0 } '
# 打印每行的最后一列
awk '{ print $NF }'
# 打印最后一行的最后一列
awk '{ field = $NF }; END{ print field }'
# 打印列数超过4的行
awk 'NF > 4'
# 打印最后一列大于4的行
awk '$NF > 4'
文本转换和替代:
# 在Unix环境:转换DOS新行 (CR/LF) 为Unix格式
awk '{sub(/\r$/,"");print}' # 假设每行都以Ctrl-M结尾
# 在Unix环境:转换Unix新行 (LF) 为DOS格式
awk '{sub(/$/,"\r");print}
# DOS环境:转换Unix新行 LF DOS格式
awk 1
# DOS环境:转换DOS新行 CR/LF Unix格式
# DOS版本的awk不能运行, 只能用gawk:
gawk -v BINMODE="w" '1' infile >outfile
#  "tr" 替代的方法。
tr -d \r <infile >outfile # GNU tr 版本为 1.22 或者更高
# 删除每行前的空白(包括空格符和制表符)
# 使所有文本左对齐
awk '{sub(/^[ \t]+/, ""); print}'
# 删除每行结尾的空白(包括空格符和制表符)
awk '{sub(/[ \t]+$/, "");print}'
# 删除每行开头和结尾的所有空白(包括空格符和制表符)
awk '{gsub(/^[ \t]+|[ \t]+$/,"");print}'
awk '{$1=$1;print}' # 每列之间的空白也被删除
# 在每一行开头处插入5个空格 (做整页的左位移)
awk '{sub(/^/, " ");print}'
# 79个字符为宽度,将全部文本右对齐
awk '{printf "%79s\n", $0}' file*
# 79个字符为宽度,将全部文本居中对齐
awk '{l=length();s=int((79-l)/2); printf "%"(s+l)"s\n",$0}' file*
# 每行用 "bar" 查找替换 "foo"
awk '{sub(/foo/,"bar");print}' # 仅仅替换第一个找到的"foo"
gawk '{$0=gensub(/foo/,"bar",4);print}' # 仅仅替换第四个找到的"foo"
awk '{gsub(/foo/,"bar");print}' # 全部替换
# 在包含 "baz" 的行里,将 "foo" 替换为 "bar"
awk '/baz/{gsub(/foo/, "bar")};{print}'
# 在不包含 "baz" 的行里,将 "foo" 替换为 "bar"
awk '!/baz/{gsub(/foo/, "bar")};{print}'
#  "scarlet" 或者 "ruby" 或者 "puce" 替换为 "red"
awk '{gsub(/scarlet|ruby|puce/, "red"); print}'
# 倒排文本 (模拟 "tac"
awk '{a[i++]=$0} END {for (j=i-1; j>=0;) print a[j--] }' file*
# 如果一行结尾为反斜线符,将下一行接到这行后面
# (如果有连续多行后面带反斜线符,将会失败)
awk '/\\$/ {sub(/\\$/,""); getline t; print $0 t; next}; 1' file*
# 排序并打印所有登录用户的姓名
awk -F ":" '{ print $1 | "sort" }' /etc/passwd
# 以相反的顺序打印出每行的前两列
awk '{print $2, $1}' file
# 调换前两列的位置
awk '{temp = $1; $1 = $2; $2 = temp}' file
# 打印每行,并删除第二列
awk '{ $2 = ""; print }'
# 倒置每行并打印
awk '{for (i=NF; i>0; i--) printf("%s ",i);printf ("\n")}' file
# 删除重复连续的行 (模拟 "uniq"
awk 'a !~ $0; {a=$0}'
# 删除重复的、非连续的行
awk '! a[$0]++' # 最简练
awk '!($0 in a) {a[$0];print}' # 最有效
# 用逗号链接每5
awk 'ORS=%NR%5?",":"\n"' file #bug awk 'ORS=NR%5?",":"\n"' file
选择性的打印某些行:
# 打印文件的前十行 (模拟 "head"
awk 'NR < 11'
# 打印文件的第一行 (模拟 "head -1"
awk 'NR>1{exit};1'
# 打印文件的最后两行 (模拟 "tail -2"
awk '{y=x "\n" $0; x=$0};END{print y}'
# 打印文件的最后一行 (模拟 "tail -1"
awk 'END{print}'
# 打印匹配正则表达式的行 (模拟 "grep"
awk '/regex/'
# 打印不匹配正则表达式的行 (模拟 "grep -v"
awk '!/regex/'
# 打印匹配正则表达式的前一行,但是不打印当前行
awk '/regex/{print x};{x=$0}'
awk '/regex/{print (x=="" ? "match on line 1" : x)};{x=$0}'
# 打印匹配正则表达式的后一行,但是不打印当前行
awk '/regex/{getline;print}'
# 以任何顺序查找包含 AAABBB  CCC 的行
awk '/AAA/; /BBB/; /CCC/'
# 以指定顺序查找包含 AAABBB  CCC 的行
awk '/AAA.*BBB.*CCC/'
# 打印长度大于64个字节的行
awk 'length > 64'
# 打印长度小于64个字节的行
awk 'length < 64'
# 打印从匹配正则起到文件末尾的内容
awk '/regex/,0'
awk '/regex/,EOF'
# 打印指定行之间的内容 8-12, 包括第8和第12行)
awk 'NR==8,NR==12'
# 打印第52
awk 'NR==52'
awk 'NR==52 {print;exit}' # 对于大文件更有效率
# 打印两个正则匹配间的内容 (包括正则的内容)
awk '/Iowa/,/Montana/' # 大小写敏感
选择性的删除某些行:
# 删除所有空白行 (类似于 "grep '.' "
awk NF
awk '/./'



其他
1) 为了避免碰到awk错误,可以总结出以下规律:
 确保整个awk_script用单引号括起来。
 确保awk_script内所有引号成对出现。
 确保用花括号括起动作语句,用圆括号括起条件语句。
 可能忘记使用花括号,也许你认为没有必要,但awk不这样认为,将按之解释语法。
 如果使用字符串,一定要保证字符串被双引号括起来(在模式中除外)
2) awk中,设置有意义的域名是一种好习惯,在进行模式匹配或关系操作时更容易理解。一般的变量名设置方式为name=$n(这里name为调用的域变量名, n为实际域号。)
3) 通常在BEGIN部分给一些变量赋值是很有益的,这样可以在awk表达式进行改动时减少很多麻烦。
4) awk的基本功能是根据指定规则抽取输入数据的部分内容并输出,另一个重要的功能是对输入数据进行分析运算得到新的数据并输出,这是通过在awk_script中对字段变量($1、$2、$3...)从新赋值或使用更大的字段变量$n(n大于当前记录的NF)而实现的。
5) 使用字符串或正则表达式时,有时需要在输出中加入一新行或查询一元字符。这时就需要字符串屏蔽序列。awk中经常使用的屏蔽序列有: \b 退格键 \t tab \f 走纸换页 \ddd 八进制值 \n 新行 \r 回车键 \c 任意其他特殊字符。eg: \\为反斜线符号
6) awk的输出函数printf,基本上和C语言的语法类似。
     格式: printf ("输出模板字符串",参数列表)
     参数列表是以逗号分隔的列表,参数可以是变量、数字值或字符串。
     输出模板字符串的字符串中必须包含格式控制符,有几个参数就要求有几个格式控制符。模板字符串中可以只有格式控制符而没有其它字符。
     格式控制符: %[-][width][.prec]fmt % : 标识一个格式控制符的开始,不可省略。 - : 表示参数输出时左对齐,可省略。 width : 一个数字,表示参数输出时占用域的宽度,可省略。 .prec : prec是一个数值,表示最大字符串长度或小数点右边的位数,可省略。 fmt : 一个小写字母,表示输出参数的数据类型,不可省略。
     常见的fmt : c ASCII字符 d 整数 e 浮点数,科学记数法 f 浮点数,如 123.44 g awk决定使用哪种浮点数转换ef o 八进制数 s 字符串 x 十六进制数
     举例: echo "65" | awk '{ printf ("%c\n",$0) }' // 将打印 A awk 'BEGIN{printf "%.4f\n",999}' //将打印 999.0000 awk 'BEGIN{printf "2 number:%8.4f%8.2f",999,888}' // 将打印 2 number:999.0000 888.000

转自http://blog.chinaunix.net/uid-83572-id-3690.html