正则表达式学习笔记

格式化显示printf

printf ‘打印格式’ 实际内容

关于格式的几个样式:

\a :警告声音输出

\b:退格键(backspace)

\f:清除屏幕

\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位,但小数点有两位,即为%10.2f

[root@centos5 ~]# printf '%s\t %s\t %s\t %s\t %s\t \n' `cat aa.log`

[root@centos5 ~]# printf '%10s %5i %8.2f \n' `cat printf.txt|grep -v name`

sed工具:

sed [-nefr] [动作]

-n 使用安静(silent)模式,在一般sed的用法中,所有来自STDIN的数据一般都会显示在屏幕上,但如果加上-n参数,则只有经过sed特殊处理的那一行才会列出来

-e 直接在命令行模式上进行sed的操作编辑

-f直接将sed的操作写在一个文件内,-f filename 则可以执行filename内的sed操作

-r sed的操作支持的是扩展正则表达式的语法

function有下面这些操作:

a:新增,a的后面可以接字符串,而这些字符串会在新的一行出现(当前的下一行)

c:替换 c的后面可以接字符串,这些字符串可以替换n1,n2之间的行

d:删除,因为是删除,所以d后面通常不接任何内容

i:插入,i的后面可以接字符串,而这些字符串会在新的一行出现(当前行的上一行)

p:打印 即答应某个选择的数据,通常p会与参数sed –n一起运行

s:搜索,不但可以搜索,还能进行替换,通常s操作可以与正则表达式一起使用 例如:1,20s/old/new/g

nl /etc/passwd |sed ‘2,5d’

在第二行后(即是加在第三行)加上“drinktea”字样

nl /etc/passwd|sed ‘2a drink tea’

在第二行前加上“drinktea”字样

nl /etc/passwd|sed ‘2i drink tea’

增加两行怎么写呢:

nl /etc/passwd|sed ‘2a Drink tea or……\

>drink bear’ 重要的是\

将2到5行替换为:no 2-5 number

nl /etc/passwd |sed ‘2,5c No 2-5 number’

nl /etc/passwd |sed –n ‘5,7p’

ifconfig etho|grep ‘inet’|sed ‘a/^.*addr://g’|sed ‘s/Bcast.*$//g’

[root@emailserver ~]# ifconfig eth0|grep 'inet addr:'|sed 's/^.*addr://g'|sed 's/Bcast.*$//g'

192.168.0.30

[root@emailserver ~]# cat /etc/man.config|grep 'MAN'|sed 's/#.*$//g'|sed '/^$/d'

MANPATH /usr/man

MANPATH /usr/share/man

MANPATH /usr/local/man

MANPATH /usr/local/share/man

MANPATH /usr/X11R6/man

MANPATH_MAP /bin /usr/share/man

MANPATH_MAP /sbin /usr/share/man

MANPATH_MAP /usr/bin /usr/share/man

MANPATH_MAP /usr/sbin /usr/share/man

MANPATH_MAP /usr/local/bin /usr/local/share/man

MANPATH_MAP /usr/local/sbin /usr/local/share/man

MANPATH_MAP /usr/X11R6/bin /usr/X11R6/man

MANPATH_MAP /usr/bin/X11 /usr/X11R6/man

MANPATH_MAP /usr/bin/mh /usr/share/man

MANSECT 1:1p:8:2:3:3p:4:5:6:7:9:0p:n:l:p:o:1x:2x:3x:4x:5x:6x:7x:8x

[root@emailserver ~]#

awk工具简介:

与sed常常作用于正行处理相比,awk比较倾向于一行中分成数个“字段”来处理。

awk ‘条件类型1{动作1} 条件类型2{动作2} 。。。。’ filename

[root@emailserver ~]# last|awk '{print $1 "\t" $3}' $0代表了一整行数据的意思。、

awk是以行为单位处理,而 以字段为最小的处理单位。

awk内置变量:NF:每一行($0)拥有的字符总数

NR:当前awk所处理的是第几行数据

FS:当前的分隔符,默认为空格键

[root@emailserver ~]# cat /etc/passwd |awk '{FS=":"} $3<10 {print $1 "\t" $3}'

root:x:0:0:root:/root:/bin/bash

bin 1

daemon 2

adm 3

lp 4

sync 5

shutdown 6

halt 7

mail 8

news 9

[root@emailserver ~]# cat /etc/passwd|awk -F ':' '$3&lt;10 {print $1 "\t" $3}'

root 0

bin 1

daemon 2

adm 3

lp 4

sync 5

shutdown 6

halt 7

mail 8

news 9

第一行没有正确显示出来,这是因为我们读入第一行的时候,那些$1,$2等默认还是以空格作为分隔的,所以虽然定义了FS=:却只能从第二行开始生效,我们可以使用BEGIN关键词预先设置awk的变量,如下所示:

[root@emailserver ~]#cat /etc/passwd|awk ‘BEGIN {FS=”:”} $3&lt;10 {print $1 “\t” $3}’

[root@emailserver ~]# cat pay.txt| awk 'NR==1{printf "%10s %10s %10s %10s %10s\n",$1,$2,$3,$4,"Total"} NR>=2{total=$2+$3+$4

&gt; printf "%10s %10d %10d %10d %10.2f\n",$1,$2,$3,$4,total}'

Name 1st 2nd 3th Total

VBird 23000 24000 25000 72000.00

DMTSai 21000 22000 23000 66000.00

Bird2 43000 42000 41000 126000.00

[root@emailserver ~]# cat pay.txt| awk 'NR==1{printf "%10s %10s %10s %10s %10s\n",$1,$2,$3,$4,"Total"} NR&gt;=2{total=$2+$3+$4;printf "%10s %10d %10d %10d %10.2f\n",$1,$2,$3,$4,total}'

Name 1st 2nd 3th Total

VBird 23000 24000 25000 72000.00

DMTSai 21000 22000 23000 66000.00

Bird2 43000 42000 41000 126000.00

[root@emailserver ~]#

文件数据比较与显示的相关功能

diff 文件比较

diff [-bBi] from-file to-file

-b 忽略一行中有多个空白的差异

-B 忽略空白行的不同

-i:忽略大小写的不同

[root@emailserver ~]# diff /etc/passwd /tmp/passwd

4d3

< adm:x:3:4:adm:/var/adm:/sbin/nologin

6c5

&lt; sync:x:5:0:sync:/sbin:/bin/sync

---

> no six line

[root@emailserver ~]#

patch命令

patch –p1 &lt;/tmp/test.patch -p就是取消第几层的意思

backdate=`date +%Y%m%d`

filename=”$filename””$backdate”

total=$(($firstnu*$secnu)) declare –I total=$firstnu*$secnu

13.3 善用判断条件

test -e filename

-e 该文件名是否存在

-f 是否为文件

-d是否为目录

test n1 –eq n2

-eq 两数值相等

-ne 两数值不等

-gt n1 大于n2

-lt n1 小于n2

-ge n1大于等于n2

-le n1小于等于n2

判断字符串的数据

test –z string 判断字符串是否为0 若string为空字符串 则为true

test –n string 判断字符串是否非为0 ,若string为空字符串 则为false 注: -n亦可省略

test str1=str2 判断str1是否等于str2 若相等 则回传true

test str1!=str2判断str1是否等于str2 若不相等 则回传false

使用判断符号[]

判断$HOME变量是否为空

[ -z “$HOME” ] 每个组件之间都要有空格

[空格”$HOME” 空格==空格”$MAIL” 空格]

重要的一点就是凡是常量都用变量表示,不然会杯具比如说

[ $name == “VBird” ] 就是个杯具,杯具的原因就是表达式会把name的值直接带进来,而没有双引号,所以最好把VBird定义成变量 比如 enname=VBird

[ $name == $enname ]

sh [-nvx] scripts.sh
-n 不执行脚本,只检查语法
-v 执行脚本前,先将脚本的内容输出到屏幕上
-x 将使用的脚本内容显示到屏幕上。

你可能感兴趣的:(正则表达式,职场,学习,笔记,休闲)