shell知識點小結1

myownstars發表於2013-06-17

迴圈結構

For  do

Done

 

While do

Done

 

Until do

Done

 

列印從510

[oracle@ ~]$ cat t1.sh

#!/bin/bash

for i in `seq 5 10`

do

  echo $i

done

[oracle@ ~]$ cat t2.sh

#!/bin/bash

for i in {5..10}

do

  echo $i

done

[oracle@ ~]$ cat t3.sh

#!/bin/bash

for ((i=5;i<=10;i++))

do

  echo $i

done

[oracle@ ~]$ sh t3.sh

5

6

7

8

9

10

 

Seq命令

       seq [OPTION]... LAST  --預設從1開始

       seq [OPTION]... FIRST LAST

       seq [OPTION]... FIRST INCREMENT LAST

-f, --format=FORMAT

              use printf style. floating-point FORMAT (default: %g)

-s, --separator=STRING

              use STRING to separate numbers (default: \n)

-w, --equal-width

              equalize width by padding with leading zeroes

 

分隔符

[oracle@ ~]$ seq -s ";" 1 5

1;2;3;4;5

[oracle@ ~]$ seq -s '#' 5

1#2#3#4#5

[oracle@ ~]$ seq -s '#' 5 | sed -e 's/[0-9]*//g'

####

 

填充0對齊

[oracle@ ~]$ seq -w 5 10

05

06

07

08

09

10

 

[oracle@ ~]$ seq -f %05g 1 5

00001

00002

00003

00004

00005

 

生成陣列

[oracle@ ~]$ b=($(seq 5 5 20))

[oracle@ ~]$ echo $b

5

[oracle@ ~]$ echo ${b[0]}

5

[oracle@ ~]$ echo ${b[@]}

5 10 15 20

 

[oracle@ ~]$ b=$(seq 5 5 20)

[oracle@ ~]$ echo $b

5 10 15 20

 

 

Basename

-- strip directory and suffix from filenames

[oracle@ ~]$ basename /usr/bin/sort

sort

[oracle@ ~]$ basename include/stdio.h .h

stdio

 

 

 

引數展開

${var:-word} --如果var存在且非Null則返回,否則返回word

${var:=word} --如果var不存在則為其賦值word並返回

${var:?message} --如果var不存在或為null,返回message

${var:+word} --如果var存在且非null則返回word,否則返回null

 

file = ${1:-/dev/tty}

 

[oracle@ ~]$ a=b
[oracle@ ~]$ echo $a,$b
b,
[oracle@ ~]$ echo ${a:-word}
b
[oracle@ ~]$ echo ${b:-word}
word
[oracle@ ~]$ echo $a,$b
b,
[oracle@ ~]$ echo ${b:=word}
word
[oracle@ ~]$ echo $a,$b
b,word

 

 

 

模式匹配

${var#pattern} 如果pattern匹配變數的開頭處,則刪除匹配的最短部分

${var%pattern} 如果pattern匹配變數的結尾處,則刪除匹配的最短部分

[oracle@ ~]$ e=ttt.tt.abc
[oracle@ ~]$ echo ${e#t}
tt.tt.abc

[oracle@ ~]$ f=abc.ttt.tt
[oracle@ ~]$ echo ${f%t}
abc.ttt.t

 

引數變數

引數大於9時,以{}括起來;

$# --引數總數,每次shift都會將當前引數移後1位並將$#1

$*/$@ -- 一次表示所有命令列引數 "hi you"會被當作兩個引數對待

"$*" --將所有引數視為一個字串"$1 $2 "

"$@" -- 將所有引數單獨列出"$1" "$2"

$$--多半用於檔案尾部,建立唯一性的檔名

$? --退出狀態值0表示成功

 

test命令

可用於比較表示式 if test "$str1" = "$str2" 等同於 if ["$str1" ="$str2"]

還用於判斷檔案型別

-b 塊裝置檔案 -c 字元裝置  -d 目錄 -e 檔案存在 -f 一般檔案

-g 設定setgid -u 設定setuid

-h/-L 符號連線

-n 字串為非null

-z 字串為null

 

字串比較 要加""並且通常新增一個固定字首 比如 if [ "X$1" = "X$2" ]

n1 -gt n2

n1 -eq n2

n1 -lt n2

n1 -le n2

n1 -ne n2

 

Cut

-d 分隔符

-f 輸出第N個欄位

[oracle@justin ~]$ cut -d: -f 1 /etc/passwd | uniq -c

      1 root

      1 bin

      1 daemon

      1 adm

      1 lp

      1 sync

      1 shutdown

      1 halt

      1 mail

      1 news

      1 uucp

 

Sort

-t 分隔符

-K n,m 按照第n個欄位的m個字元排序

-n 按數字排序

-r 降序排列

-u只要鍵值唯一,重複的讀第一條;uniq則比較所有欄位,都相同才唯一;uniq –c/-d/-u

-f 忽略字母大小寫

-m 將已排序的輸入檔案合併為一個排序後輸出

-o 將輸出指定到一個檔案

 

Sort –t: -k1,1 /etc/password—以使用者名稱第一個字母排序

 

grep

^--匹配字首

$--匹配字尾

^$--匹配空行

.--單個字元

+--1個或多個字元

?--0個或1個字元

*--0個或多個字元

[^]—不包含指定字元

[:digit:]

[:alnum:]--匹配數字

[:alpha:]--匹配字元,[[:alpha:]]匹配所有英文字母

[:lower:]

[:upper:]

\{n,m\}--匹配前面字元n-m

 

grep -v '^$' --刪除空行

行最後3個字元為大寫 [[:upper:]]\{3\}$

[[:upper:]]\{3\}$則變成了最後N(N>=3)個為大寫

^abc|efg$--要麼以abc開頭,要麼以efg結尾的行

^(abc|efg)$--該行要麼為abc,要麼為efg

社保號 ***-**-****[0-9]\{3\}-[0-9]\{2\}-[0-9]\{4\}

 

 

Sed

使用()支援向後引用,用數字替代()裡的內容;

sed 's;\(/home\)/tolsoty;\1/lt;'--不必重複輸入/home

預設sed只替換第一個匹配,末尾可新增數字或g,表示只替換第N個或全部替換;

[oracle@justin ~]$ echo justin read well. justin write well. > tmp.txt

[oracle@justin ~]$ more tmp.txt

justin read well. justin write well.

[oracle@justin ~]$ sed 's/justin/Justin/' < tmp.txt

Justin read well. justin write well.

[oracle@justin ~]$ sed 's/justin/Justin/2' < tmp.txt

justin read well. Justin write well.

[oracle@justin ~]$ sed 's/Justin/justin/g' < tmp.txt

justin read well. justin write well.

 

sed -n '10,42p' foo.xml --列印10-42

使用//查詢候選字元

sed '/foo/,/bar/ s/baz/quux/g'--查詢包含foobar的行,然後將baz替換為quux

透過反義字元\指定有別於/的界定符

sed -n '\:tolstoy: s;;Tolstoy;p' /etc/passwd

 

指定行插入資料
1.在指定行前插入一行
sed '2 ittt' -i a.txt # 在第2行前插入ttt,並且將結果更新到a.txt(如果不想將插入真正更新到檔案,去掉後面的-i選項就可以)

2.在指定行後插入一行
sed '2 attt' -i a.txt #在第2行後插入ttt,並且將結果更新到a.txt(如果不想更新原檔案,去掉-i)

3.在指定的多行前面插入
sed 'n,m ittt' -i a.txt #看得懂了吧

4.在指定的多行後面插入
sed 'n,m attt' -i a.txt #看得懂了吧
http://blog.csdn.net/zbszhangbosen/article/details/7434191 

 

awk

FILENAME--當前輸入檔名

FNR--當前檔案的記錄數

FS--欄位分隔符,預設" ",只有在超過一個字元時,才計算作正規表示式

NF--當前記錄欄位數,$0為整條記錄,$NF為當前記錄最後一個欄位

NR--job記錄數

OFS--輸出欄位分隔符,預設" "

ORS--輸出記錄分隔符,預設\n

ARGC--輸出引數總數

ARGV--引數向量,即陣列,第0個元素為awk本身

 

過程用{}

指令使用’’

正規表示式使用//

 

陣列為稀疏結構,即x[1]=314 x[1000]=31562-999都沒有實際儲存

delete array/array[index]用於刪除整個陣列和單個陣列元素

輸入和輸出分隔符分別由-FS-OFS指定

awk 'begin { FS = ':'; FS = '**' } { print $1, $5} ' /etc/passwd

awk –F: ‘{print “User”, $1, “is really”, $5} ’ /etc/passwd

 

使用AWK模擬wc

[oracle@ ~]$ more hello

asdf sdf

[oracle@ ~]$ wc hello

1 2 9 hello

[oracle@ ~]$ awk '{C+= length($0) + 1; W+=NF} END{print NR,W,C,FILENAME}' hello  --紅體部分為迴圈操作(遍歷輸入檔案),最後執行end

1 2 9 hello

 

使用awk篩選行

[oracle@ ~]$ awk '(FNR >= 7) && (FNR <= 1000) && /DISKSINFO/ {print FILENAME ":" FNR ":" $0}' md_backup.txt

md_backup.txt:8:                     'DISKSINFO' => {

md_backup.txt:345:                     'DISKSINFO' => {

 

[oracle@ ~]$ awk '/diskgroup_set|DISKSINFO/' md_backup.txt

@diskgroup_set = (

                     'DISKSINFO' => {

                     'DISKSINFO' => {

                     'DISKSINFO' => {

                     'DISKSINFO' => {

                     'DISKSINFO' => {

                     'DISKSINFO' => {

 

使用awk過濾重複行

[oracle@ ~]$ cat tmp.info

@diskgroup_set = (

                     'DISKSINFO' => {

                     'DISKSINFO' => {

                     'DISKSINFO' => {

                     'DISKSINFO' => {

                     'DISKSINFO' => {

                     'DISKSINFO' => {

[oracle@ ~]$ sort tmp.info | uniq

@diskgroup_set = (

                     'DISKSINFO' => {

[oracle@ ~]$ sort tmp.info | awk 'Last != $0 {print} {Last = $0}'

@diskgroup_set = (

                     'DISKSINFO' => {

 

 

將段落按第一行首字母排序

首先使用awkRS=””將記錄以空行分割,即每個段落合成一行;gsub為全域性替換函式,類似seds/r/t/g

[oracle@justin ~]$ cat contact

justin

shanghai

021-44444

 

emily

beijing

010-444

 

zoo

nanjiang

020-4444

 

[oracle@justin ~]$ cat contact | awk -v RS="" '{ gsub("\n","^Z"); print} ' |sort -k1,1 | awk -v RS="\n\n" '{ gsub("^Z","\n"); print } '--2gsub沒有起作用

emily^Zbeijing^Z010-444

 

justin^Zshanghai^Z021-44444

 

zoo^Znanjiang^Z020-4444

 

[oracle@justin ~]$ cat contact | awk -v RS=""  '{ gsub("\n","^Z"); print} ' |sort -k1,1 | awk -v RS="\n\n" '{print}' | sed 's/\^Z/\n/g'

emily

beijing

010-444

 

justin

shanghai

021-44444

 

zoo

nanjiang

020-4444

 

 

 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/15480802/viewspace-764096/,如需轉載,請註明出處,否則將追究法律責任。