任意字符
^行首匹配
$行尾匹配
^$表示空行,不含字符的行
^ $匹配只有單個空格的行
[0-9]
[a-zA-Z]
^[A- Z]搜索以大寫字母開頭的行
[^A-Z]匹配大寫字母意外的任意字符
*表示匹配0個或若干個字符,如:a*,表示匹配0個或若干個a; aa*表示匹配至少1個a
.*來表示0或若干個任意字符
e.e*表示匹配第一個e和最后一個e之間的任意字符
[-0-9]匹配一 個連字符或數(shù)字
[]a-z]匹配一個]或者字母
\{min,max\}匹配任意數(shù)目的字符串
[a-z]\{10\}只匹配10個 a-z字符的字符串
s/.\{5\}$// 刪除每行的最后5個字符
\(...\),n是1到9的數(shù)字,表示存儲用的寄存器,用\n來引 用存在寄存器中的內(nèi)容
^\(.\)\1匹配行首的第一個字符,并將該字符存到1號寄存器中,然后匹配1號寄存器中的內(nèi)容,這由\1的描述。該正則 表達式的最終效果是,如果一行的頭兩個字符相同,就匹配他們。
^\(.\).*\1$匹配一行中的頭一個字符(^.)跟最后一個字符(\1$)相 同的行。.*匹配中間的所有內(nèi)容
^\(...\)\(...\)行中頭三個字符存在1號寄存器,接著的三個字符存在2號寄存器.
s/\(.*\) \(.*\)/\2 \1/g 交換兩個字段
.任何字符
^行首
$行尾
*前導(dǎo)的正則表達式重復(fù)0或若干次
[字 符表]字符中的任一字符
a..表示a后的2個字符
^wood表示行首的wood
x$表示行為的x
^INSERT$只包含 字符串INSERT的行
^$不包含任何字符的行
x*表示0或若干個連續(xù)的x
xx*表示1或多個連續(xù)的x
.*表示0活若干 個字符
w.*s表示以w開始,s結(jié)尾的任何字符串
[tT]小寫或大寫的t
[^字符表]表示任一不在字符表中的字符 [^0-9] [^a-zA-Z]
\{min,max\}表示前導(dǎo)的正則表達式重復(fù)只燒min次,至多max次[0-9]\{3,9\}表示3到 9個數(shù)字
\(...\)表示將小括號中匹配的字符串存儲到下一個寄存器中(1-9),
^\(.\)表示行中第1個字符存到1號寄存器
^\ (.\)\1表示行首戀歌字符,且他們相同
cut -c5 file把file文件中沒行的第5個字符析取出來;
用逗號分割的數(shù) 值列表,如-c1,13,50把第1,13,50個字符析取出來
cut -c20-50把第20到50之間的字符析取出來
如
who | cut -c1-8
who | cut -c1-8,18- 析取行中的第1到8個字符(用戶名)和第18到行尾的字符(登錄時間)
cut -ddchar -ffields file其中,dchar是數(shù)據(jù)中分割各字段的分割符,fields表示要從文件file中析取出來的字段.
字 段編號從1開始,而且格式跟以前將的用來指定字符位置的數(shù)字一樣(如-f1、2、8、-f1-3、-f4-)。
cut -d: -f1 /etc/passwd
如果已知字段之間使用制表符分隔的,就可以給cut命令用-f選項而不用-c選項,好多了!還記得吧,這里用不著用-d選 項來指定分割符,因為
cut把制表符默認為分割符。
paste和cut正好相反,它不是把行分離開,而是把多行合并在一起。
paste names numbrs文件names中的每一行都和numbers中的對應(yīng)行顯示在一起,中間用制表符分割。
如果不想用制表符作默認分割, 可以使用-dchars指定分割符
paste -d'+' names addresses numbers
-s選項告訴paste把同 一文件中的行粘貼在一起,而不是從其他文件。如果只指定一個文件名,其效果是把文件中的所有行合并成一行,原來隔行之間用制表符或者有-d選項指定的分割 符分割。
sed是用來編輯數(shù)據(jù)的程序,意指流編輯器(stream editor)。與ed不同,sed不能用于交互,
-n選 項,然后使用p命令顯式指定
sed -n '1,2p' file只顯示前2行
sed -n '/Unix/p' file只打印包含Unix的行
刪除行
d刪除整行文件
sed '1,2d' file刪除1和2行
記住sed默認把輸入 的所有行寫入標(biāo)準(zhǔn)輸出,所以生于行的文字,也就是從第3行到結(jié)尾,都被寫入標(biāo)準(zhǔn)輸出。
sed '5d'刪除第5行
sed '/[Tt]est/d'刪除包含test或Test的行
sed -n '20,25p' test只顯示文件test的第20行到第25行
sed '1,10s/unix/UNIX/g' intro報intro前10行中的unix改為UNIX
sed '/jan/s/-1/-5/'將所有包含jan的行中第1個-1改為-5
sed 's/...//' data刪除data文件每一行的前3個字符
sed 's/...$//' data刪除data文件每一行的最后3個字符
sed -n 'I' text顯示文件text的所有行,把所有不可打印字符顯示為\nn,制表符顯示為\t
過濾器tr用來轉(zhuǎn)換來自標(biāo)準(zhǔn)輸入的字 符,tr命令的一般格式為
tr from-chars to-chars
tr e x < intro把所有字母e轉(zhuǎn)換成x
tr命令的輸入必須重定向到文件intro,因為tr總是從標(biāo)準(zhǔn)輸入獲得輸入;轉(zhuǎn)換的結(jié)果寫入標(biāo)準(zhǔn)輸出,而原始文 件保持不變。
cut -d: -f1,6 /etc/passwd | tr : ' ' 通過在管道線的最后加上適當(dāng)?shù)膖r命令,就可以把冒號轉(zhuǎn)換成制表符,這樣產(chǎn)生的輸出更容易看
單引號中括的是制表符(盡管你看不到)。必須將它括在 引號中,以便穿過shell,使tr有機會看到它。
使用\nnn來給tr提供8進制表示的字符
一些ascii字符的八進制值
響 鈴 7
退格 10
制表符 11
新行 12
換行 12
換頁 14
回 車 15
轉(zhuǎn)義 33
date | tr ' ' '\12'此例中,tr接受date命令的輸出,并把所有的空格轉(zhuǎn)換成換行
tr '[a-z]' '[A-Z]' <intro將所有小寫轉(zhuǎn)換為大寫
-s選項,tr命令中的-s選項用來壓縮to-chars中重復(fù)的字符,換句話說,如果轉(zhuǎn)換完成后,有 to-chars中的某個字符連續(xù)出現(xiàn)多次,則這些連續(xù)相同的字符被替換為一個字符。
如下面的命令將冒號轉(zhuǎn)換為制表符,并將多個連續(xù)制表符替換為 單個制表符:
tr -s ':' '\11\'
tr -s ' ' ' ' <lotspaces通過-s將多個空格全部壓縮為單個空格
-d選項用來刪除掉輸入流中的字符,其一般格式為
tr -d from-chars任何列在from-chars中的字符都會被從標(biāo)準(zhǔn)輸入中刪除。下例用tr來刪除文件intro中的所有空格:
tr -d ' ' <intro
當(dāng)然sed 's/ //g' intro也可以得到同樣的效果
tr 'X' 'x' 把大X專成小x
tr '()' '{}' 把所有左小括號轉(zhuǎn)換成左大括號,右小括號專成右大括號
tr '[a-z]' '[A-Z]' 把小寫轉(zhuǎn)大寫
tr '[A-Z]' '[N-ZA-M]' 把A-M字母分別專成N-Z把N-Z轉(zhuǎn)成A-M
tr ' ' ''把所有制表符轉(zhuǎn)換成空格
tr -s ' ' ''把多個空格轉(zhuǎn)換成單個空格
tr -d '\14' 刪除所有換頁字符(八進制14)
tr -d '[0-9]'刪除所有數(shù)字
grep '[A-Z]' list list中包含一個大寫字母的行
grep '[0-9]' data中包含數(shù)字的行
grep '[A-Z]...[0-9]' list list中包含以大寫字母開始、數(shù)字結(jié)尾的5個字符組合的行
grep '\.pic$' filelist filelist中以.pic結(jié)尾的行
uniq in_file
out_file該格式中,uniq把in_file復(fù)制到out_file,處理過程中,去掉其中的重復(fù)行。如果不指定第2個參數(shù)out_file,結(jié)
果就寫入標(biāo)準(zhǔn)輸出;如果in_file沒有指定,那么uniq就成了一個過濾器,從標(biāo)準(zhǔn)輸入讀取輸入。
>或< 重定向,覆蓋原有的內(nèi)容
>>或<< 重定向,想文件末尾追加內(nèi)容
tee 顯示在終端上的內(nèi)容存儲到文件 ls | tee >glx
-d 目錄
-e 存在
-f 普通文件
-r 進程可讀文件
-s 長度不為0
-w 進程可寫文件
-x 可執(zhí)行
-L 鏈接文件
$# 傳給程序的參數(shù)個數(shù),或者執(zhí)行set命令設(shè)置的參數(shù)個數(shù)
$* 對位置參數(shù)等的集中引用
$@ 跟$*相似,區(qū)別在于當(dāng)加入雙引號后("$@"),集中引用位置參數(shù)"$1","$2"...等
$0 正執(zhí)行的程序名
$$ 正執(zhí)行程序的進程id
$! 最后一個發(fā)生后臺運行的程序的進程id
$? 最后一個在前臺執(zhí)行的程序的退出狀態(tài)
$- 當(dāng)前有效選項標(biāo)志
`command`符號之間的內(nèi)容為需要執(zhí)行的命令
make -C /lib/modules/`uname -r`/build M=`pwd`
使用echo可以顯示字符串,但是不能格式化字符串,可以使用printf實現(xiàn)
printf "format" arg1 arg2 ...
ln -s from to 把from鏈接到to上,所以to是from的符號鏈接
tree -d只顯示目錄
tree -L 2顯示2級目錄
字符串比較
s1 = s2 s1等于s2
s1 != s2 s1不等于s2
s1 s1不為空
-n s1 s1不為空
-z s1 s1為空
整數(shù)比較操作
-eq 等于
-ge 大于或等于
-gt 大于
-le 小于或等于
-lt 小于
-ne 不等于
[ "$x1" = 5 ]字符串比較
[ "$x1" -eq 5 ]整數(shù)比較
-a 邏輯與操作
-o 邏輯或操作
command1 && command2
則先執(zhí)行command1,如果返回的退出狀態(tài) 為0,則執(zhí)行command2;如果command1返回的退出狀態(tài)非0,則跳過command2
command1 || command2
和上邊的&&差不多,只是,僅僅當(dāng)command1返回非0時,才執(zhí)行command2
#!/bin/sh
append2=0
include_lib=1
if [ -f cscope_i ];then
rm cscope_i
fi
for cscope_file in $*; do
if [ -f "$cscope_file" ] || [ -d "$cscope_file" ];then
# if [ $cscope_file = '-a' ];then
# append2=1
# continue
# fi
#
# if [ $cscope_file = '-n' ];then
# include_lib=0<F11>
# continue
# fi
if [ "$append2" = "1" ];then
find $cscope_file -maxdepth 1 -name '*.[cChH]' -o -name '*.[cC][pP][pP]'>>cscope_i
else
find $cscope_file -name '*.[cChH]' -o -name '*.[cC][pP][pP]'>>cscope_i
fi
else
if [ $cscope_file = '-a' ];then
append2=1
elif [ $cscope_file = '-n' ];then
include_lib=0
else
echo "Error: cannot read file $cscope_file"
fi
fi
done
if [ -f cscope_i ];then
if [ "$include_lib" = "1" ];then
cscope -bi cscope_i
else
cscope -bki cscope_i
fi
rm cscope_i
fi |