Chinaunix首页 | 论坛 | 博客
  • 博客访问: 35807
  • 博文数量: 10
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 105
  • 用 户 组: 普通用户
  • 注册时间: 2014-04-02 00:18
个人简介

undertone & excelence

文章分类

全部博文(10)

文章存档

2015年(1)

2014年(9)

我的朋友

分类: LINUX

2014-07-11 00:52:43

正则表达式应用举例:^  $  \<\>  [集合或序列]  [^被取反集合或序列]  \{数字\}
eg: grep '^[[:upper:]]' t.txt  #<----找到大写字母开头的行(^行首锚定)
eg: grep -v '^$' t.txt  #<----去掉空行($行尾锚定)
eg: grep '\ t.txt  #<----找出s开头,中间任意字符,d结尾的词(\<和\>词首和词尾锚定,点号。表示任意"一个"字符。)
eg: grep '\<[aeiou]' t.txt  #<----找出以aeiou任意一个字母开头的词语( [集合或序列] 表示中括弧中的任意"一个"字符。 此例的中括弧中的字母可以用逗号隔开)
eg: grep '[^a-z,0-9]' t.txt  #<----找出不是小写字母和数字的行([^集合或序列] 表示出了这个集合或序列之外,此例中的逗号有无皆可。)
eg: grep 'o\{2\}' t.txt  #<----找出只有两个o的字符串。food和dooog皆显示(因为没有限制第三个字母)。( \{\} 表示重复前面字符的个数)
eg: grep 'o\{2,5\}' t.txt  #<----找出两个到五个o的字符串。(六个o也显示,因为没有对第六个字母做限制)
eg: grep 'o\{2,\}' t.txt  #<---- 找出两个或两个以上o的字符串。


扩展正则表达式应用举例:+ ? | ()
eg: egrep 'go+d' t.txt  #<----重复前面的RE字符至少一次 (god、good和goood都能显示)
eg: egrep 'go?d' t.txt  #<----重复前面的RE字符至多一次 (gd和god可以显示出来)
eg: egrep '^$|^#' t.txt  #<----删除空行和注释行 (|表示两个表达式的“或”关系)
eg: egrep 't(a|e)st' t.txt  #<----()用于表示表达式"或"的组合。此例等效于 eg: grep 't[ae]st' t.txt
eg: egrep '(XYZ)\{2\} t.txt  #<----()用于某种特征组合的重复。
eg: egrep 'eat(ing)?'  #<----匹配eat和eating




sed应用举例:
   语法: sed [-nefr] [action] {filenames}     或者  sed [option]  'AddressCommand'
  Address的表示方法:
  1、m,n  从m行到n行 ,如果只有m,则表示第m行,最后一行用$表示
  2、/pattern1/,/pattern2/  从第一个匹配模式,到第二个匹配模式的行。如果只有第一个,则表示匹配符合该模式的行
  3、m,+n 第m行及其后面的n行        
eg: sed -i '2c Nothing' test.txt  #<----把第二行替换成字符串Nothing,并直接将更改写入文件,不输出到stdout
eg: sed  '2a exit 0' test.txt  #<----在第二【行后】添加新的一行exit 0
eg: sed  '3,$i # Optional code' test.txt  #<----在第三行后的所有【行前】添加新行。(注意:^在eg: sed中不可作界定之用)
eg: sed  -n '2,5p' /etc/passwd  #<----仅显示2~5行,其他行不显示。(-n 仅显示)
eg: sed  's/^[A-Z].*//g' test.txt  #<----用空行替换所有大写字母开头的行。
eg: sed  '2,8d' test.txt  #<----删除第2`8行
eg: sed  -r 's/o+|e+//g' test.txt  #<----所有的o和e都替换成零长(-r 扩展正则表达式)
eg:   DATA=`date +%x"  "%T` ;  sed -i '$i  it is ok at '"$DATA"'  '  /msg/msg.log  # <---变量的传递 单引号和双引号。 


awk应用举例:
mage: awk [options] 'pattern {action}' file...
用法:awk [ -F re] [parameter...] ['pattern {action}'] {filenames}  完整的句法参考http://blog.chinaunix.net/uid-25266990-id-100557.html 
其中'pattern {action}'也叫'prog'程序语句段,必须用单引号括起来,防止被shell解释。action总是被{}包裹。pattern和action可舍弃其一,但不能全舍弃。
pattern可以执行各种运算(如逻辑运算、算术运算、各种操作符、流程控制与循环、自定义函数...基本和C语言近似)
pattern 类型:
1-RegExp 格式为 /RegExp/   eg: awk -F: '/^r/ {print $3}'   /etc/passwd #只处理r开头的行
2-expression  表达式值为零或字符串非空时满足条件。eg: awk -F: '$7 ~ /bash$/ {print $1} /etc/passwd # /regexp/可以用”regexp"替换。
3-range  符合模式的范围: pat1,pat2
4-BEGIN/END  在awk命令开始前/命令结束前,执行一次(awk是每读取一行就执行一次命令)
                                            eg: awk -F:  'BEGIN{print "USER UID"}'  {printf "%-6s%3s",$1,$3}END{print "end" '  /etc/passwd   #BEGIN打印表头
5-空模式和其他模式
             空模式表示对没一行都要处理
              BEGINFILE
              ENDFILE
              relational expression
              pattern && pattern   eg:  ifconfig |awk '/^[^ ]/ && !/lo/ {print $1}'   #本机非lo的网卡
              pattern || pattern
              pattern ? pattern : pattern
              (pattern)
              ! pattern
              pattern1, pattern2

ACTIONS的类型:
1-expression
2-control statements  判断用(),语句体用{},语句间用;分隔。while until for循环的是字段
                       eg: awk -F: '{if($3<1000) print $1"   system user" ; else print $1"   common user" }' /etc/passwd
                       eg : awk -F:  -v sys=0  '{if($3<1000) sys++; } END {printf "系统用户%i个\n",sys }'   /etc/passwd
                       eg: awk -F:  '{i=1; while (i<=NF) {if (length($i)>=20) { print $i } ; i++  } }' /etc/passwd  #长度大于等于20的字段(comment)
                      多分支:switch (expression) {case value or /RegEx/ : stmt1,stmt2...default:stmt1,stmt2;...}
                      关键字: break continue用于循环,而next是提前结束该行,跳到下一行
3-compound statements 
4-input/output statements

数组 array[ xx ] 下标可以自定义,如果未定义,则从1开始。eg:  arr[mon]=1  arr[sun]=7  引用数组是 for (var in arry) {stmt1;stmt2...}
awk -F: '{shell[$NF]++ } END {for ( A in shell) {printf "使用 %-20s 的用户有%i个\n",A,shell[A]} }'   /etc/passwd
awk '{counter[$1]++} END{for(A in counter) printf "ip: %18s 访问次数:$i",A,counter[A]}'   /var/log/httpd/access.log


0-区间内容: $0表示整行,$1表示第一个区块。awk是逐行读取,切片,并分析和处理的工具。
1-变量名称和意义 
  NF(Number of Field)区间数
  NR 当前处理的是第几行(简单理解为行号)
  FS 分隔符,未指定时,默认为空格和tab
2-逻辑运算符
  运算单元 代表意义 
> 大于 
< 小于 
>= 大于或等于 
<= 小于或等于 
== 等于 
!= 不等于 
x ~ y   字符串x是否匹配y模式。!~表示不匹配
表达式间的逻辑关系:&& 和 ||
select?if-ture-exp:if-false-exp 类似于if then else
3-一般执行方式为:awk [-F  field-separator]  'commands'  input-file(]s) 
eg:tail -n 3 /etc/passwd |awk -F ':' '{printf "第"NR"行\n账户名:"$1"\n区间总数:"NF"\n\n"}'  显示/etc/passwd最后三个账户位于文件第几行,账户名和区间总数
eg: tail -n 3 /etc/passwd |awk 'BEGIN{FS=":"} {printf "第"NR"行\n账户名:"$1"\n区间总数:"NF"\n\n"}'  上面列子可以改写成这样。两个{}之间可以用空格或者分号;隔开。执行顺序是,awk先执行BEGIN(BEGIN作用于Pattern,它在花括弧之前),然后读取第一行,切片处理。如果没有BEGIN的话,第一行就不能被正确格式化。
eg: awk -F : 'NR==1,NR==7 {printf $1"\t"$3"\t"$7"\n"}'  /etc/passwd  显示第1~7行的账户名、UID和Shell类型。
eg: awk等价于grep的用法 awk '/关键字或RE/' filename (awk默认显示整个记录,亦即整行)
eg:awk 'length($0)>80 {print NR}' t.txt  调用awk内置的length函数,显示大于80字节的行。
eg: 范围的pattern,pat1,pat2。  如:awk '/if/,/fi/ {print $0}' test.sh #将test.sh的if条件判断部分显示出来(包括if和fi那行).
eg: awk -v var="hello" 'BEGIN {print var}'    #-v定义变量。引用变量无须$。BEGIN在这里是为了不用文件演示。
eg: awk 'BEGIN{var="hello"; print var}'   # 变量赋值的另一种形式


pattern的条件判断与循环(与C很类似):
if (condition) {then body} else {else body} 
eg:if的例子
awk 'BEGIN{sum=0;} { \
>if (length($0)>=45) \
>{printf "%-15s%-10s >=45 *\n",$1,NR;sum++;} \
>else \
>{printf "%-15s%-10s <45\n",$1,NR;} \
>END{print 大于45字节的有sum行;}' /etc/passwd 
while (condition) {statement1,statement2,...}
do {statement1,statement2,...} while (condition)
for (variable assignment;condition;iteration progress) {statement1,statement2,...}
for (i in array) {statement1,statement2,...} #for遍历数组
switch (expression) {case VALUE or /REGEXP/:statement1,statement2,...default:statement1,statement2l
循环或条件判断关键字:break 、continue、next和exit (与C很类似)







阅读(1329) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

Joy_Jeo2014-11-08 22:25:46

ifconfig |awk '/Bcas/ {split($2,array,":");print array[2]}' # 获取ip地址