shell 命令集

來源:互聯網
上載者:User

標籤:

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 命令集

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.