歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Unix知識 >> 關於Unix >> shell學習之 歷史遺跡

shell學習之 歷史遺跡

日期:2017/3/6 15:22:43   编辑:關於Unix
2004-11-10 基本元字符集及其含義 ^ 只只匹配行首 只只匹配行尾 * 只一個單字符後緊跟*,匹配0個或多個此單字符 [ ] 只匹配[ ]內字符。可以是一個單字符,也可以是字符序列。可以使用- 表示[ ]內字符序列范圍,如用[ 1 - 5 ]代替[ 1 2 3 4 5 ] \ 只用來屏蔽

2004-11-10
基本元字符集及其含義
^ 只只匹配行首
$ 只只匹配行尾
* 只一個單字符後緊跟*,匹配0個或多個此單字符
[ ] 只匹配[ ]內字符。可以是一個單字符,也可以是字符序列。可以使用-
表示[ ]內字符序列范圍,如用[ 1 - 5 ]代替[ 1 2 3 4 5 ]
\ 只用來屏蔽一個元字符的特殊含義。因為有時在s h e l l中一些元字符有
特殊含義。\可以使其失去應有意義
. 只匹配任意單字符
p a t t e r n \ { n \ } 只用來匹配前面p a t t e r n出現次數。n為次數
p a t t e r n \ { n,\ } m 只含義同上,但次數最少為n
p a t t e r n \ { n,m \ } 只含義同上,但p a t t e r n出現次數在n與m之間


例:
#######
. 的情況

1。 ....xc....
假定正在過濾一個文本文件,對於一個有1 0個字符的腳本集,要求前4個字符之後為X C,


注意表達文件名時用單個?,而“.”用在正則裡
ls -l ?bc
ls -l |grep ".bc"

#######
^ 只匹配行首
2。 ^...1
在行首第4個字符為1,

#######
$
3.trouble$
假定要匹配以
單詞t r o u b l e結尾的所有行

#######
4.只返回包含一個字符的行
^.$

^youhongyu$只返回 只包含youhongyu的行

#######
使用\屏蔽一個特殊字符的含義

$ . ' " [] ^ | ( ) \ + ?


5.\*\.pas
如果要在正則表達式中匹配以* . p a s結尾的所有文件

######
[]

例:
假定要匹配任意一個數字,可以使用:
[ 0 1 2 3 4 5 6 7 8 9 ]
然而,通過使用“-”符號可以簡化操作:
[ 0 - 9 ]
或任意小寫字母
[ a - z ]
要匹配任意字母,則使用:
[ A - Z a - z ]
表明從A - Z、a - z的字母范圍。
如要匹配任意字母或數字,模式如下:
[ A - Z a - z 0 - 9 ]
在字符序列結合使用中,可以用[ ]指出字符范圍。假定要匹配一單詞,以s開頭,中間有
一任意字母,以t結尾,那麼操作如下:
s[a-z A-Z]t


注意^符號的使用,當直接用在第一個括號裡,意指否定或不匹配括號裡內容
[^0-9]
匹配任一非字母字符
不在括號裡是 只字首

################
使用\匹配模式結果出現的次數

操作如下:
匹配字母A出現兩次,並以B結尾
A \ { 2 \ } B
匹配值為A A B
匹配A至少4次,使用:
A \ { 4 , \ } B
可以得結果A A A A B或A A A A A A A B,但不能為A A A B。
如給出出現次數范圍,例如A出現2次到4次之間:
A \ { 2 , 4 \ } B
則結果為A A B、A A A B、A A A A B,而不是A B或A A A A A B等。

########################
經常使用的正則表達式舉例
^ 對行首
$ 對行尾
^ [ t h e ] 對以t h e開頭行
[ S s ] i g n a [ l L ] 對匹配單詞s i g n a l、s i g n a L、
S i g n a l、S i g n a L
[Ss]igna[lL]\. 對同上,但加一句點
[ m a y M A Y ] 對包含m a y大寫或小寫字母的

^ U S E R $ 對只包含U S E R的行
[tty]$ 對以t t y結尾的行
\ . 對帶句點的行
^ d . . x . . x . . x 對對用戶、用戶組及其他用戶
組成員有可執行權限的目錄
^ [ ^ l ] 對排除關聯目錄的目錄列表
[ . * 0 ] 對0之前或之後加任意字符
[ 0 0 0 * ] 對0 0 0或更多個
[ iI] 對大寫或小寫I
[ i I ] [ n N ] 對大寫或小寫i或n
[ ^ $ ] 對空行
[ ^ . * $ ] 對匹配行中任意字符串
^ . . . . . . $ 對包括6個字符的行
[a- zA-Z] 對任意單字符
[ a - z ] [ a - z ] * 對至少一個小寫字母
[ ^ 0 - 9 \ $ ] 對非數字或美元標識
[ ^ 0 - 0 A - Z a - z ] 對非數字或字母
[ 1 2 3 ] 對1到3中一個數字
[ D d ] e v i c e 對單詞d e v i c e或D e v i c e
D e . . c e 對前兩個字母為D e,後跟兩個任意字符,最後為c e
\ ^ q 對以^ q開始行
^ . $ 對僅有一個字符的行
^\.[0-9][0-9] 對以一個句點和兩個數字開始的行
' " D e v i c e " ' 對單詞d e v i c e
D e [ V v ] i c e \ . 對單詞D e v i c e或d e v i c e
[ 0 - 9 ] \ { 2 \ } - [ 0 - 9 ] \ { 2 \ } - [ 0 - 9 ] \ { 4 \ } 對日期格式d d - m m - y y y y
[ 0 - 9 ] \ { 3 \ } \ . [ 0 - 9 ] \ { 3 \ } \ . [ 0 - 9 ] \ { 3 \ } \ . [ 0 - 9 ] \ { 3 \ } 對I P地址格式nnn. nnn.nnn.nnn
[ ^ . * $ ] 對匹配任意行

經常使用正則表達的命令 grep awk sed


2004-10-27
grep **********************************

在g r e p 命令中輸入字符串參數時,最好將其用雙引號括起來。例如:“m y s t r i n g ”。這樣做
有兩個原因,一是以防被誤解為s h e l l 命令,二是可以用來查找多個單詞組成的字符串,例如:
“jet plane ”,如果不用雙引號將其括起來,那麼單詞p l a n e 將被誤認為是一個文件,查詢結果
將返回“文件不存在”的錯誤信息。
在調用變量時,也應該使用雙引號,諸如:g r e p “$ M Y VA R ”文件名,如果不這樣,將
沒有返回結果。在g r e p 命令中輸入字符串參數時,最好將其用雙引號括起來。例如:“m y s t r i n g ”。這樣做
有兩個原因,一是以防被誤解為s h e l l 命令,二是可以用來查找多個單詞組成的字符串,例如:
“jet plane ”,如果不用雙引號將其括起來,那麼單詞p l a n e 將被誤認為是一個文件,查詢結果
將返回“文件不存在”的錯誤信息。
在調用變量時,也應該使用雙引號,諸如:g r e p “$ M Y VA R ”文件名,如果不這樣,將
沒有返回結果。


-s 屏蔽錯誤信息
-i 區分大小寫
-v 反向查找,就是找不包含的
-w 只查找指定的單詞
-E 擴充模式 比如查找 you 或者hong grep -E 'you|hong'

使用g r e p抽取精確匹配的一種更有效方式是在抽取字符串後加\ >。

假定現在精確抽取4 8,
缺省情況下, g r e p是大小寫敏感的,如要查詢大小寫不敏感字符串,必須使用- i開關
如果要抽出記錄,使其行首不是4 8,可以在方括號中使用^記號,表明查詢在行首開始

如果抽取以K開頭,以D結尾的所有代碼,可使用下述方法,因為已知代碼長度為5個字
grep 'K...D' data.f

將上述代碼做輕微改變,頭兩個是大寫字母,中間兩個任意,並以C結尾:
grep '[A-Z][A-Z]..C'

查詢包含1 9 9 8的所有記錄的另外一種方法是使用表達式[ 0 - 9 ] \ { 3 \ } [ 8 ],含義是任意數字重
復3次,後跟數字8,
grep '[0-9]\[8]'

有時要查詢重復出現次數在一定范圍內,比如數字或字母重復出現2到6次,下例匹配數
字8重復出現2到6次,
grep '6\

grep '6\至少兩次

結合使用^和$可查詢空行。使用- n參數顯示實際行數:
grep '^$' myfile

查詢有特殊含義的字符,諸如$ . ' " * [] ^ | \ + ? ,必須在特定字符前加\。假設要查詢包含“.”
的所有行,腳本如下:
grep 'conftroll\.conf' myfile


。系統中對文本文件有其標准的命名格式。一般最多
六個小寫字符,後跟句點,接著是兩個大寫字符。
grep '[a-z]\\.[A-Z]\'


如果要查詢目錄列表中的目錄,方法如下:
ls -l|grep '^d'

如果在一個目錄中查詢不包含目錄的所有文件,方法如下:
ls -l|grep '^[^d]'
^ 含義 行首
^ 不包含

greo "aaron" /etc/password >dev/null 2>
腳本含義是匹配命令輸出或錯誤( 2 > $ 1),並將結果輸出到系統池。大多數系統管理員稱
/ d e v / n u l l為比特池,沒關系,可以將之看成一個無底洞,有進沒有出,永遠也不會填滿。


grep "48<tab>" mysql.txt
查找48後加tab鍵盤的在mysql.txt中

grep "48/>" mysql.txt
在mysql.txt中查找只包括48的行

grep "48[34]" mysql.txt
在mysql.txt中查找483,或者484行

結合使用^和$可查詢空行。使用- n參數顯示實際行數:

grep
1。選項
-c 只輸出匹配行的計數。 *****
-i 不區分大小寫(只適用於單字符)。
-h 查詢多文件時不顯示文件名。
-l 查詢多文件時只輸出包含匹配字符的文件名。
-n 顯示匹配行及行號。
-s 不顯示不存在或無匹配文本的錯誤信息。
-v 顯示不包含匹配文本的所有行。 ******

例題:

48 dec 3bc1997 lpsx 68.00
1.精確匹配
grep "48<tab>" data.f
或者
grep '48\>' data.f 通常用

egrep
如果要查詢存儲代碼3 2 L 或2 C C ,可以使用(|)符號,意即“|”符號兩邊之一或全部。

egrep "(32L|2CC)" you.txt


**************************************
awk
在碰到a w k錯誤時,可相應查找:
? 確保整個a w k命令用單引號括起來。
? 確保命令內所有引號成對出現。
? 確保用花括號括起動作語句,用圓括號括起條件語句。
? 可能忘記使用花括號,也許你認為沒有必要,但a w k不這樣認為,將按之解釋語法。


awk '{print ,'} abc.txt
打印1,4列 默認是空格做分割,代表整行

awk 'BEGIN {print "name Belt\n-----------------------"} {print "\t"}' abc.txt
還可以加
awk 'BEGIN {print "name Belt\n-----------------------"} {print "\t"} END {print "end of report"}' abc.txt

awk '{print NR}' abc.txt 打印行號

awk '{if ( ~/b/) print }' mycron
包含 字符b
awk '{if ( ~/1/) print }' mycron
不包含b


awk ' ~/([Yy]ellow|Brown)/' abc.txt

awk '{if (=="Yellow"|| ~/Brown/) print }' abc.txt
或者滿足
awk '{if (=="Yellow"&& ~/Brown/) print }' abc.txt
同時滿足

2004-11

################################find
希望在系統根目錄下查找更改時間在5日以內的文件,可以用:
$ find / -mtime -5 -print
為了在/ v a r / a d m目錄下查找更改時間在3日以前的文件,可以用:
$ find /var/adm -mtime +3 -print


find . -type l
查找類型是連接文件的


2004-11-06

touch -d 11/04 abcc 修改或者創建時間是11月4號的文件
touch -d 23:25 abcc 修改或者創建時間是23:25的文件
和 -t的不同在於寫法 -t 11042325 11月4號23點25分


shell 中單個的“\” 代表忽略後面的回車符號,命令從下一行繼續

問題,如何看幫助如
Usage: find [path...] [expression]
default path is the current directory; default expression is -print
expression may consist of:
operators (decreasing precedence; -and is implicit where no others are given):
( EXPR ) ! EXPR -not EXPR EXPR1 -a EXPR2 EXPR1 -and EXPR2

EXPR1 -o EXPR2 EXPR1 -or EXPR2 EXPR1 , EXPR2
options (always true): -daystart -depth -follow --help
-maxdepth LEVELS -mindepth LEVELS -mount -noleaf --version -xdev
tests (N can be +N or -N or N): -amin N -anewer FILE -atime N -cmin N

-cnewer FILE -ctime N -empty -false -fstype TYPE -gid N -group NAME
-ilname PATTERN -iname PATTERN -inum N -ipath PATTERN -iregex PATTERN
-links N -lname PATTERN -mmin N -mtime N -name PATTERN -newer FILE

shell
################################
find
語法: find 路徑 選項 [-print -exec -ok ]
例子
-name
1。find . -name "*.txt"
查找當前目錄下 所有名字有.txt的文件

2。find / -name "[abc][0-9]"
尋找 根目錄下 名字 第一個是a/b/c,第二個是數字的文件

-perm
3。find . -perm 755
查找當前目錄下所有權限是755的文件

-nouser
4。find /home -nouser
查找在/etc/password文件中沒有有效帳戶的文件

-mtime
5。find / -mtime -5
查找5天以內的文件
find / -mtime +5
查找5天前的文件


+5是大於五的意思,-5是小於5的意思
6。查找比某個文件新,同時又比另某個文件舊的文件
find / -newer age.awk ! -newer belts.awk

技巧:
如果要查找比更改時間前兩個小時的文件 可以先
touch -t 11042140 dstamp (創建比現在時間兩個小時前的文件:11月4號21點40分的一個文件)
find . -newer dstamp 就可以查找兩個小時內的文件了。

7。-type
find /etc/ -type d
查找所有目錄文件
常用的:l 符號連接文件 f 普通文件

8。-size
find /etc -size 100k 大小大約在100k的文件
find /etc -size +100k 大小大於100k的文件
find /etc -size -100k 大小小於100k的文件


9。-mount
只查找本文件系統的文件

執行
10。-exec
find /etc/ -size +100k -exec ls -l {} \;
查找/etc/下文件大於100k的文件並顯示詳細信息

錯誤語法:
find /etc/ -size +100k|ls -l
只顯示當前目錄信息,無法起到管道服務的作用
find /etc/ -size +100k -exec ls -l {} (空格)\;(分號)

11。-ok 和-exec作用一樣,但是在執行前會有確認(yes/no)


2004-11-08


s h e l l是從左至右分析相應的命令的


c r o n t a b的格式:
分< >時< >日< >月< >星期< >要運行的命令
其中< >表示空格。

例如你希望星期一至星期五運行某個作
業,那麼可以在星期域使用1 - 5來表示。還可以在這些域中使用逗號“,”,例如你希望星期一
和星期四運行某個作業,只需要使用1 , 4來表示。可以用星號*來表示連續的時間段。如果你
對某個表示時間的域沒有特別的限定,也應該在該域填入*。


30 21* * * /apps/bin/cleanup.sh
上面的例子表示每晚的2 1 : 3 0運行/ a p p s / b i n目錄下的c l e a n u p . s h。
45 4 1,10,22 * * /apps/bin/backup.sh
上面的例子表示每月1、1 0、2 2日的4 : 4 5運行/ a p p s / b i n目錄下的b a c k u p . s h。
10 1 * * 6,0 /bin/find -name "core" -exec rm {} \;
上面的例子表示每周六、周日的1 : 1 0運行一個f i n d命令。
0,30 18-23 * * * /apps/bin/dbcheck.sh
上面的例子表示在每天1 8 : 0 0至2 3 : 0 0之間每隔3 0分鐘運行/ a p p s / b i n目錄下的d b c h e c k . s h。
0 23 * * 6 /apps/bin/qtrend.sh
上面的例子表示每星期六的11 : 0 0 p m運行/ a p p s / b i n目錄下的q t r e n d . s h。


c r o n t a b命令的一般形式為:
Crontab [-u user] -e -l -r
其中:
-u 用戶名。
-e 編輯c r o n t a b文件。
-l 列出c r o n t a b文件中的內容。
-r 刪除c r o n t a b文件。

nohup
########################
如果使用n o h u p命令提交作業,那麼在缺省情況下該作業的所有輸出都被重定向到一個名
為n o h u p . o u t的文件中,除非另外指定了輸出文件:
nohup command > myout.file 2>&1
在上面的例子中,輸出被重定向到m y o u t . f i l e文件中

輸入輸出
echo #######################
e c h o命令有很多功能,其中最常用的是下面幾個:
\c 不換行。
\f 進紙。
\t 跳格。
\n 換行。

linux 中
是-n 不換行,使轉義符生效-e


引號問題
初涉s h e l l的用戶常常會遇到的一個問題就是如何把雙引號包含到e c h o命令的字符串中。
引號是一個特殊字符,所以必須要使用反斜槓\來使s h e l l忽略它的特殊含義。假設你希望使用
e c h o命令輸出這樣的字符串:“/ d e v / r m t 0”,那麼我們只要在引號前面加上反斜槓\即可:
echo "\"/dev/rmt0"\"

read
##########
我們給出了兩個變量,它們分別被賦予名字和姓氏。s h e l l將用空格作
為變量之間的分隔符:
例:
read name surname
you hongyu(輸入的內容)
echo $name $surname
you hongyu

######
cat
無分頁功能
可以合並多個文件

tee
#######
輸出到屏幕的同時 可以輸出到文件

tee datadel.sh
-a 是添加輸入到文件


標准輸入、輸出和錯誤
當我們在s h e l l中執行命令的時候,每個進程都和三個打開的文件相聯系,並使用文件描
述符來引用這些文件。由於文件描述符不容易記憶, s h e l l同時也給出了相應的文件名。
下面就是這些文件描述符及它們通常所對應的文件名:
文件文件描述符
輸入文件-標准輸入0
輸出文件-標准輸出1
錯誤輸出文件-標准錯誤2
系統中實際上有1 2個文件描述符,但是正如我們在上表中所看到的, 0、1、2是標准輸入、
輸出和錯誤。


例:
1。cat password 1 >abc.out 和cat password >abc.out是一樣的
都是把輸出內容到文件abc.out中

2。>abc.out
創建空文件

3. sort <name.txt >name.cout
對name.txt排序,通過重定向為s o r t命令指定一個輸出文件n a m e . o u t。
這樣屏幕上將不會出現任何信息(除了錯誤信息以外):

4。cat >>youhongyu.txt <<MAYDAY
abc
youhongyu
MAYDAY


重定向操作符command << delimiter是一種非常有用的命令,通常都被稱為“此處”文擋。
我們將在本書後面的章節深入討論這一問題。現在只介紹它的功能。s h e l l將分界符d e l i m i t e r之
後直至下一個同樣的分界符之前的所有內容都作為輸入,遇到下一個分界符, s h e l l就知道輸
入結束了。這一命令對於自動或遠程的例程非常有用。可以任意定義分界符d e l i m i t e r,最常見
的是E O F,而我最喜歡用M AY D AY,這完全取決於個人的喜好。還可以在< <後面輸入變量。
下面給出一個例子,我們創建了一個名為m y f i l e的文件,並在其中使用了T E R M和L O G N A M E
變量。


為了重定向標准錯誤,可以指定文件描述符2
5.grep "youhongyu" abc.txt 2 >/dev/null
把錯誤重定向到文件/ d e v / n u l l中(實際就上是系統的垃圾箱):

6. grep "youhongyu" abc.txt 2 >grep.err
保存到g r e p . e r r文件中:

7.grep "youhongyu" abc.txt 1>you.dat 2>you.err
輸出到you.dat,錯誤信息輸出到you.err


8. grep "standtard" you.txt >you.out 2>
g r e p命令的標准輸出和標准錯誤都被重定向到g r e p . o u t文件中。

命令執行順序
使用&&
################
使用& &的一般形式為:
命令1 && 命令2
這種命令執行方式相當地直接。& &左邊的命令(命令1)返回真(即返回0,成功被執行)
後,& &右邊的命令(命令2)才能夠被執行;換句話說,“如果這個命令執行成功& &那麼執
行這個命令”。

例:
1。mv /bin/apaps /bin/abc/ && rm -r /bin/apaps

如果/bin/apaps/移動不成功,則不刪除

使用||
使用| |的一般形式為:
命令1 || 命令2
| |的作用有一些不同。如果| |左邊的命令(命令1)未執行成功,那麼就執行| |右邊的命令
(命令2);或者換句話說,“如果這個命令執行失敗了|| 那麼就執行這個命令”。

sh daily.sh||exit

Copyright © Linux教程網 All Rights Reserved