格式化顯示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
第一行沒有正确顯示出來,這是因為我們讀入第一行的時候,那些$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}'
檔案資料比較與顯示的相關功能
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
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 将使用的腳本内容顯示到螢幕上。
本文轉自guoli0813 51CTO部落格,原文連結:http://blog.51cto.com/guoli0813/353072,如需轉載請自行聯系原作者