Chinaunix首页 | 论坛 | 博客
  • 博客访问: 57116
  • 博文数量: 48
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 260
  • 用 户 组: 普通用户
  • 注册时间: 2015-08-16 11:04
文章分类

全部博文(48)

文章存档

2015年(48)

分类: 系统运维

2015-08-16 20:54:59

一.正则表达式

1.什么是正则表达式

正则表达式基本上是一种“表示法”,只要工具程序支持这种表示法,那么该工具程序就可以用来作为正则表达式的字符串处理之用。例如vi,grep,,awk,sed等工具,因为它们有支持正则表达式

2.语系对正则表达式的影响



3.基础正则表达式字符(characters)

4.grep,sed使用

[root@www ~]# grep [-A] [-B] [--color=auto] '搜寻字符串' filename  选项参数: -A :后面可加数字,为 after 的意思,除了列出该行外,后续的 n 行也列出来; 
-B :后面可加数字,为 befer 的意思,除了列出该行外,前面的 n 行也列出来; --color=auto 可将正确的那个选取数据列出颜色
[root@www ~]# sed [-nefr] [劢作] 
选项参数: -n :使用安静(silent)模式。在一般 sed 的用法中,所有来自 STDIN 的数据一般都会被列出到屏幕上。但如果加上 -n 参数后,则只有经过 sed 特殊处理的那一行(或者动作)才会被列出来。  -e :直接在指令列模式上进行 sed 的动作编辑;  -f :直接将 sed 的动作写在一个文件内, -f filename 则可以执行 filename 内的 sed 劢作;  -r :sed 的动作支持的是扩展型正则表达式的语法。(默认是基础正则表达式语法)  -i :直接修改读取的文件内容,而不是由屏幕输出。 动作说明: [n1[,n2]]function n1, n2 :不见得会存在,一般代表『选择进行动作的行数』,举例来说,如果我的动作是需要在 10 到 20 行之间进行的,则『 10,20[动作行为] 』 function 有底下这些咚咚:  a :新增, a 的后面可以接字符串,而这些字符串会在新的一行出现(目前的下一行)~ 
c :替换, c 癿后面可以接字符串,这些字符串可以替换 n1,n2 之间的行! 
d :删除,因为是删除啊,所以 d 后面通常不接任何咚咚; 
i :插入, i 癿后面可以接字符串,而这些字符串会在新的一行出现(目前的上一行); 
p :打印,也就是将某个选择的数据印出。通常 p 会与参数 sed -n 一起运作~ 
s :替换,可以直接进行替换的工作哩!通常这个 s 的动作可以搭配正则表达式!例如 1,20s/old/new/g 就是啦!

案例:

步骤一:先观察原始信息,利用 /sbin/ifconfig 查询 IP 为何? 
[root@www ~]# /sbin/ifconfig eth0  eth0 Link encap:Ethernet HWaddr 00:90:CC:A6:34:84 inet addr:192.168.1.100 Bcast:192.168.1.255 Mask:255.255.255.0 inet6 addr: fe80::290:ccff:fea6:3484/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 .....
(以下省略).....
步骤二:利用关键词配合 grep 选取出关键的一行数据 
[root@www ~]# /sbin/ifconfig eth0 | grep 'inet addr'  inet addr:192.168.1.100 Bcast:192.168.1.255 Mask:255.255.255.0 # 当场仅剩下一行!接下l来,我们要将开始到 addr: 通通删除,就是像底下这样:  # inet addr:192.168.1.100 Bcast:192.168.1.255 Mask:255.255.255.0 # 上面的删除关键在于『 ^.*inet addr: 』啦!正则表达式出现! ^_^  步骤三:将 IP 前面的部分予以删除 
[root@www ~]# /sbin/ifconfig eth0 | grep 'inet addr' | \ > sed 's/^.*addr://g'  192.168.1.100 Bcast:192.168.1.255 Mask:255.255.255.0 # 仔细与上个步骤比较一下,前面的部分不见了!接下来则是删除后续的部分,即:  # 192.168.1.100 Bcast:192.168.1.255 Mask:255.255.255.0  # 此时所需的正则表达式为:『 Bcast.*$ 』就是啦!  步骤四:将 IP 后面的部分予以删除 
[root@www ~]# /sbin/ifconfig eth0 | grep 'inet addr' | \ > sed 's/^.*addr://g' | sed 's/Bcast.*$//g'  192.168.1.100 #另一个例子 利用 sed 将 regular_express.txt 内每一行结尾若为 . 则换成 ! 
[root@www ~]# sed -i 's/\.$/\!/g' regular_express.txt  # 上头的 -i 选项可以让你的 sed 直接去修改后面接的文件内容而不是由屏幕输出喔!

二.文件的格式化及相关处理

1.格式化打印:printf

语法:

[root@www ~]# printf '打印格式' 实际内容  选项参数: 
关于格式方面的几个特殊样式: 
\a 警告声音输出 
\b 退格键(backspace) 
\f 清除屏幕 (form feed) 
\n 输出新的一行 
\r 即 Enter 按键 
\t 水平的 [tab] 按键 
\v 垂直的 [tab] 按键 
\xNN NN 为两位数的数字,可以转换数字成为字符。 关于 C 程序语言内,常见的变量格式 %ns 那个 n 是数字, s 代表 string ,即多少个字符; %ni 那个 n 是数字, i 代表 integer ,即多少整数字数; %N.nf 那个 n 与 N 都是数字, f 代表 floating (浮点),如果有小数字数, 假如我共要十个位数,但小数点有两位,即为 %10.2f 啰!
案列:
将 (printf.txt) 内容仅列出姓名与成绩:(用 [tab] 分隔) 
[root@www ~]# printf '%s\t %s\t %s\t %s\t %s\t \n' $(cat printf.txt)  Name Chinese English Math Average 
DmTsai 80 60 92 77.33 VBird 75 55 80 70.00 Ken 60 90 70 73.33
2.awk:好用的数据处理工具


[root@www ~]# awk '条件类型1{动作1} 条件类型2{动作2} ...' filename
awk内置变量

案例:

[root@www ~]# last -n 5| awk '{print $1 "\t lines: " NR "\t columes: " NF}'  root lines: 1 columes: 10 root lines: 2 columes: 10 root lines: 3 columes: 10 dmtsai lines: 4 columes: 10 root lines: 5 columes: 9 # 注意喔,在 awk 内的 NR, NF 等变量要用大写,且不需要有 $ 啦!
awk的逻辑运算符(用于条件判断 

    ——————————超人爱因斯坦于2014年11月01日更新

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