格式化显示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<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<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
> 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>=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
< sync:x:5:0:sync:/sbin:/bin/sync
---
> no six line
[root@emailserver ~]#
patch命令
patch –p1 </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 将使用的脚本内容显示到屏幕上。