天天看點

正規表達式學習筆記

格式化顯示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

第一行沒有正确顯示出來,這是因為我們讀入第一行的時候,那些$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}'

檔案資料比較與顯示的相關功能

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

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 将使用的腳本内容顯示到螢幕上。

本文轉自guoli0813 51CTO部落格,原文連結:http://blog.51cto.com/guoli0813/353072,如需轉載請自行聯系原作者

繼續閱讀