正則表達式學習筆記

格式化顯示printf正則表達式

printf ‘打印格式’ 實際內容centos

關於格式的幾個樣式:bash

\a :警告聲音輸出ide

\b:退格鍵(backspace)工具

\f:清除屏幕spa

\n:輸出新的一行命令行

\r:即enter按鍵server

\t:水平的tab按鍵ip

\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 將使用的腳本內容顯示到屏幕上。

相關文章
相關標籤/搜索