正则表达式应用举例:^ $ \<\> [集合或序列] [^被取反集合或序列] \{数字\}
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) |