標籤:
shell 常用知識點
---------------------------------------
sed 用法http://www.cnblogs.com/edwardlost/archive/2010/09/17/1829145.html
sed是非互動編輯器。它不會修改檔案,除非使用shell重新導向來儲存結果。預設情況下,所有的輸出行都被列印到螢幕上。
sed不向grep一樣,不管是否找到指定的模式,它的退出狀態都是0。只有當命令存在語法錯誤時,sed的退出狀態才不是0。
sed命令告訴sed如何處理由地址指定的各輸入行,如果沒有指定地址則處理所有的輸入行。
1. 簡單替換
sed -i "s/123/456/" <file>// i 插入文本
eg:
echo 123 > sed.txt
sed -i "s/123/456/" sed.txt
cat sed.txt
[email protected]:~/myworkspace/sed$ cat sed.txt
456
-p 地址是一個數字,則表示行號;是“$"符號,則表示最後一行
------------------
e.g.
sed -n ‘3p‘ datefile//輸出第三行的內容
sed -n ‘100,200p‘ datefile // 查看100~200行的內容
sed ‘/my/p‘ datefile //輸出匹配到my的行 並且再次列印一次 同時列印其他全部內容,若沒匹配輸出其他內容
sed -n ‘/my/p‘ datefile //僅僅輸出匹配到的行的內容
-d
--------------------
sed ‘2,5d‘ datafile #刪除第二到第五行 輸出其他內容
sed ‘/My/,/You/d‘ datafile #刪除包含"My"的行到包含"You"的行之間的行
sed ‘/My/,10d‘ datafile #刪除包含"My"的行到第十行的內容
-s
-----------------------
sed ‘s/^My/You/g‘ datafile #命令末端的g表示在行內進行全域替換,也就是說如果某行出現多個My,所有的My都被替換為You。
sed -n ‘1,20s/My$/You/gp‘ datafile #取消預設輸出,處理1到20行裡匹配以My結尾的行,把行內所有的My替換為You,並列印到螢幕上。
sed ‘s#My#Your#g‘ datafile #緊跟在s命令後的字元就是尋找串和替換串之間的分隔字元。
分隔字元預設為正斜杠,但可以改變。無論什麼字元(分行符號、反斜線除外),只要緊跟s命令,就成了新的串分隔字元。
-e -e是編輯命令,用於sed執行多個編輯任務的情況下。在下一行開始編輯前,所有的編輯動作將應用到模式緩衝區中的行上
--------------------
sed -e ‘1,10d‘ -e ‘s/My/Your/g‘ datafile #選項-e用於進行多重編輯。第一重編輯刪除第1-3行。
第二重編輯將出現的所有My替換為Your。因為是逐行進行這兩項編輯(即這兩個命令都在模式空間的當前行上執行),
所以編輯命令的順序會影響結果。
r命令是讀命令。sed使用該命令將一個文字檔中的內容加到當前檔案的特定位置上。
----------
sed ‘/My/r introduce.txt‘ datafile
#如果在檔案datafile的某一行匹配到模式My,就在該行後讀入檔案introduce.txt的內容。
如果出現My的行不止一行,則在出現My的各行後都讀入introduce.txt檔案的內容。
w命令
------------------
sed -n ‘/my/w me.txt‘ datafile
y 命令
-----------
sed ‘1,20y/my12/MY^$/‘ datafile
#將1到20行內,所有的小寫hrwang轉換成大寫,將1轉換成^,將2轉換成$。
#Regex元字元對y命令不起作用。與s命令的分隔字元一樣,斜線可以被替換成其它的字元。
2.擷取對於的行的內容
sed -n ‘1,np‘ <file>
eg:
echo 123456 > sed.txt
sed -n ‘1p‘ > sed.log
cat sed.log
123456
3. 列印模式 匹配對於的行的內容
sed -n ‘/需要尋找的內容/‘p <file>
eg:
[email protected]:~/myworkspace/sed$ sed -n ‘/ro.build.display.id/‘p build.prop
ro.build.display.id=fiber_chiphd-eng 4.2.2 JDQ39 20140425 test-keys
sed
------
選項 功能
-e 進行多項編輯,即對輸入行應用多條sed命令時使用
-n 取消預設的輸出
-f 指定sed指令碼的檔案名稱
4. 判斷語句
1>.檔案名稱的測試
-e filename 如果 filename存在,則為真
-d filename 如果 filename為目錄,則為真
-f filename 如果 filename為常規檔案,則為真
-L filename 如果 filename為符號連結,則為真
-r filename 如果 filename可讀,則為真
-w filename 如果 filename可寫,則為真
-x filename 如果 filename可執行,則為真
-s filename 如果檔案長度不為0,則為真
-h filename 如果檔案是軟連結,則為真
filename1 -nt filename2 如果 filename1比 filename2新,則為真。
filename1 -ot filename2 如果 filename1比 filename2舊,則為真。
2>. 數字測試
-eq 等於 則為真。
-ne 不等於 則為真。
-gt 大於 則為真。
-ge 大於等於 則為真。
-lt 小於 則為真。
-le 小於等於 則為真。
至於!號那就是取非
num1 -eq num2等於[ 3 -eq $mynum ]
num1 -ne num2不等於[ 3 -ne $mynum ]
num1 -lt num2小於[ 3 -lt $mynum ]
num1 -le num2小於或等於[ 3 -le $mynum ]
num1 -gt num2大於[ 3 -gt $mynum ]
num1 -ge num2大於或等於[ 3 -ge $mynum ]
3>. 字串測試
= 等於則為真。
!= 不相等則為真。
-z字串 字串長度偽則為真。
-n字串 字串長度不偽則為真。
-z string如果 string 長度為零,則為真[ -z "$myvar" ]
-n string如果 string 長度非零,則為真[ -n "$myvar" ]
string1 = string2如果 string1 與 string2 相同,則為真[ "$myvar" = "one two three" ] 判斷$a和$b是否相等
string1 != string2如果 string1 與 string2 不同,則為真[ "$myvar" != "one two three" ]
if [ "$ver" ];then
若字串存在 則為真
fi
一、判斷讀取字串值
Bash Shell可以進行變數的條件替換,既只有某種條件發生時才進行替換,替換條件放在{}中.
(1) ${value:-word}
當變數未定義或者值為空白時,傳回值為word的內容,否則返回變數的值.
(2) ${value:=word}
與前者類似,只是若變數未定義或者值為空白時,在返回word的值的同時將 word賦值給value
(3) ${value:?message}
若變數已賦值的話,正常替換.否則將訊息message送到標準錯誤輸出(若此替換出現在Shell程式中,那麼該程式將終止運行)
(4) ${value:+word}
若變數已賦值的話,其值才用word替換,否則不進行任何替換
(5) ${value:offset}
${value:offset:length} 從變數中提取子串,這裡offset和length可以是算術運算式.
(6) ${#value}
變數的字元個數
(7) ${value#pattern}
${value##pattern}
去掉value中與pattern相匹配的部分,條件是value的開頭與pattern相匹配
#與##的區別在於一個是最短匹配模式,一個是最長相符模式.
(8) ${value%pattern}
${value%%pattern}
於(7)類似,只是是從value的尾部於pattern相匹配,%與%%的區別與#與##一樣
(9) ${value/pattern/string}
${value//pattern/string}
進行變數內容的替換,把與pattern匹配的部分替換為string的內容,/與//的區別與上同
注意: 上述條件變數替換中,除(2)外,其餘均不影響變數本身的值
二、字串操作(長度,讀取,替換)
運算式含義
${#string}$string的長度
${string:position}在$string中, 從位置$position開始提取子串
${string:position:length}在$string中, 從位置$position開始提取長度為$length的子串
${string#substring}從變數$string的開頭, 刪除最短匹配$substring的子串
${string##substring}從變數$string的開頭, 刪除最長相符$substring的子串
${string%substring}從變數$string的結尾, 刪除最短匹配$substring的子串
${string%%substring}從變數$string的結尾, 刪除最長相符$substring的子串
${string/substring/replacement}使用$replacement, 來代替第一個匹配的$substring
${string//substring/replacement}使用$replacement, 代替所有匹配的$substring
${string/#substring/replacement}如果$string的首碼匹配$substring, 那麼就用$replacement來代替匹配到的$substring
${string/%substring/replacement}如果$string的尾碼匹配$substring, 那麼就用$replacement來代替匹配到的$substring
字串 長度計算 echo ${#test}// # 取字串長度
4>. 算術運算子
+ - * / % 表示加減乘除和取餘運算
+= -= *= /= 同 C 語言中的含義
5>. 位操作符
> >>= 表示位左右移一位操作
& &= | |= 表示按位與、位或操作
~ ! 表示非操作
^ ^= 表示異或操作
6>.關係運算子
= == != 表示大於、小於、大於等於、小於等於、等於、不等於操作
&& || 邏輯與、邏輯或操作
5. 注釋
1.# 開頭
2.
6. find 用法
find . -name \*
find ./ -name "xxx"
find . -mtime -1 -type f -print 用來尋找過去24小時(-mtime -2則表示過去48小時)內修改過的檔案
find . -size +1000c -print
如果您想將所有尋找到的檔案打一個包,則可以使用以下指令碼
#!/bin/sh
tar -zcvf lastmod.tar.gz `find . -mtime -1 -type f -print`
7. grep
8. awk <http://www.cnblogs.com/ggjucheng/archive/2013/01/13/2858470.html>
find . -name proj_help.sh | awk -F/ ‘{print $(NF-4) "/"}‘
9. "if" 運算式如果條件為真則執行then後面的部分:
if ....; then
....
elif ....; then
....
else
....
fi
10. case運算式可以用來匹配一個給定的字串,而不是數字。
case ... in
...) do something here
esac
11. select 運算式是一種bash的擴充應用,尤其擅長於互動式使用。使用者可以從一組不同的值中進行選擇。
select var in ...do
break
done
.... now $var can be used ....
eg:
#!/bin/sh
echo "What is your favourite OS?"
select var in "Linux" "Gnu Hurd" "Free BSD" "Other"; do
break
done
echo "You have selected $var"
下面是該指令碼啟動並執行結果:
What is your favourite OS?
1) Linux
2) Gnu Hurd
3) Free BSD
4) Other
#? 1
You have selected Linux
12. while 您也可以在shell中使用如下的loop運算式:
while ...; do
....
done
while -loop 將運行直到運算式測試為真。 will run while the expression that we test for is true.
關鍵字"break" 用來跳出迴圈。而關鍵字"continue"用來不執行餘下的部分而直接跳到下一個迴圈。
for-loop運算式查看一個字串列表 (字串用空格分隔) 然後將其賦給一個變數:
for var in ....; do
....
done
eg:
#!/bin/sh
for var in A B Cdo
echo "var is $var"
done
13. echo
-------------------------
字背景色彩範圍:40 - 49
40:黑
41:深紅
42:綠
43:黃色
44:藍色
45:紫色
46:深綠
47:白色
-----------------------
字顏色:30 - 39
30:黑
31:紅
32:綠
33:黃
34:藍色
35:紫色
36:深綠
37:白色
-----------------------
ANSI控制碼
\33[0m 關閉所有屬性
\33[01m 設定高亮度
\33[04m 底線
\33[05m 閃爍
\33[07m 反顯
\33[08m 消隱
\33[30m -- \33[37m 設定前景色彩
\33[40m -- \33[47m 設定背景色
\33[nA 游標上移n行
\33[nB 游標下移n行
\33[nC 游標右移n行
\33[nD 游標左移n行
\33[y;xH設定游標位置
\33[2J 清屏
\33[K 清除從游標到行尾的內容
\33[s 儲存游標位置
\33[u 恢複游標位置
\33[?25l 隱藏游標
\33[?25h 顯示光線標
----------------------------
eg:
echo -e "\033[31m xxx \033[0m"
echo -e "\e[1;32m xxx \e[0m "
eg:
#!/bin/bash
a=10
echo -e "Value of a is $a \n"
運行結果:
Value of a is 10
-e 表示對逸出字元進行替換。如果不使用 -e 選項
若沒有參數,運行結果:
Value of a is 10 \n
14. tr
echo “HELLO WHO IS THIS” | tr ‘A-Z‘ ‘a-z‘//大小寫轉換
cat file.txt | tr -d ‘0-9‘ //將數字去掉 tr -d
15. sort
16. bash的參數
$0 傳回值
$1 第一個參數
$2 第二個參數
[email protected] 被擴充為 "$1" "$2" "$3" (用得最多)
$* 被擴充為 "$1c$2c$3"
$#表示參數個數
舉例說:
指令碼名稱叫test.sh 入參三個: 1 2 3
運行test.sh 1 2 3後
$*為"1 2 3"(一起被引號包住)
[email protected]為"1" "2" "3"(分別被包住)
$#為3(參數數量)
$* [email protected] "[email protected]" "$1" "$2" "$3"
"$*" "$1 $2 $3"
17.linux shell之尋找命令 <http://www.jbxue.com/LINUXjishu/21304.html>
find
locate
whereis
which
type
18. cut
echo $PATH | cut -d: -f 3,5 //取出第3行和第5行
last | cut -d ‘ ‘ -f 1
last | cut -c 9-15
last | cut -c 9-
last | cut -d " " -f 1 | sort | uniq
last | cut -d " " -f 1 | sort | uniq -c
rename shell
eg:
#!/bin/bash
count=1;
for item in Chapter*
do
new=c${item##* }
mv "$item" "$new" 2>/dev/null
if [ $? -eq 0 ];then
echo "Renaming $img to $new"
let count++
fi
done
shell 調試
最簡單的調試命令當然是使用echo命令。您可以使用echo在任何懷疑出錯的地方列印任何變數值。
這也是絕大多數的shell程式員要花費80%的時間來偵錯工具的原因。Shell程式的好處在於不需要重新編譯,插入一個echo命令也不需要多少時間。
shell也有一個真實的偵錯模式。如果在指令碼"strangescript" 中有錯誤,您可以這樣來進行調試:
sh -x strangescript
這將執行該指令碼並顯示所有變數的值。
shell還有一個不需要執行指令碼只是檢查文法的模式。可以這樣使用:
sh -n your_script
這將返回所有語法錯誤。
shell 傳回值
常用命令
------------------------------------
wc用於統計字元數
tree命令是以圖形化的樹狀結構列印檔案和目錄的主角
全志命令
------------------------------------
godir
mm
mmm
croot
cdeives
cout
cgrep
resgrep
jgrep
大量刪除某個檔案
find . -name ‘xxx‘ -exec rm -r {} +
shell 命令集