linux bash shell常用技巧(2)



接上一篇的內容。

1.標準輸出與標準錯誤輸出重定向到其他文件(或者/dev/null)

grep "str" file >/dev/null 2>&1
或者
grep "str" file &>/dev/null

2.過濾重複行

sort -u file
其中的-u參數,有點兒類似於uniq,所以以上的命令大致等價於sort file | uniq,不過直接使用sort的-u參數更簡潔一點兒
以上這個是排序然後去除重複行,也即最終得到的順序可能已經不是我們原先的順序了。而我們有時候需要的是,去除文件中的重複行,同時保持原來的順序,此時可以使用awk命令進行操作:
awk '!a[$0]++' infile > outfile
該命令的原出處忘記了,此處對原作者表示抱歉。在這兒只是簡單解釋一下該命令。
awk的基本格式爲awk 'pattern {action}',其中action省略時,默認爲{print},所以awk '1',相當於awk '1 {print}'.
對於該命令,第一次讀一行數據時,a[$0]是爲0的,由於有"!",所以!a[$0]爲1,也即相當於awk '1',即打印當前行。這之後a[$0]執行++,即之後a[$0]的值應該是1.
如果讀取到跟之前的某一行一樣的數據,那麼a[$0]是1,!a[$0]爲0,即awk '0',不打印當前行,即不打印之前已經打印過的行。這也就達到了去重的目的。
值得注意的是,命令當中的自加命令++,應該是放置到後面的,即先執行!,之後再去執行++。
該命令雖短小,但是技巧性十足,贊一個!

3.shell編程中,對於$1,$2,....等位置參數的使用。

如果只使用第二個參數以後的參數,及$2,$3..,以前我曾經寫過
shift
echo "$@"
後來才知道更方便的做法是echo "${@:2}"
同樣的,我們如果只使用最後一個參數,可以使用 "${@: -1},注意-1前面有一個空格,否則可能導致其識別爲

${param:-word}的語法

4.上面談到了${param:-word}語法,我們可以使用這個來設置參數的默認值,

arg=${1:-"hello"}
那麼如果沒有給第一個位置參數,arg的值將會爲"hello"。關於${}參數展開的詳細用法,將會在下一篇中詳細記錄,由於是自己學習的過程,應該會使用實例解釋。

5.數學運算

雖然我用到的不多,但是記得有一次需要用到,還是google到的(迄今bash手冊都沒看完,當時也沒去查),其實有兩個方法:
第一種是使用expr,例如:
a=1
a=`expr $a + 1`
或者可以使用a=$(($a+1))
第二種是使用let命令
a=1
let a++
需要注意的是,使用expr時變量是需要加上$來引用的,使用let命令時則不需要。

6.使用bash的展開功能(這兒指大括號擴展)

例如新建多個文件夾時,可以執行
mkdir /path/to/your/dir/{old,new,hello}
該命令在/path/to/your/dir下面同時創建了三個文件夾,分別爲old,new,hello

該功能在我們備份時也比較有用,尤其是我比較喜歡在編輯配置文件前,先備份,可以如下備份:
cp /path/to/your/file{,-backup}
該命令將會複製file的一個副本,並使用file-backup來保存。

而且該功能其實也支持嵌套,例如需要同時創建一個項目的目錄結構,可以如下創建
mkdir -p project/{lib/ext,bin,src,doc/{html,info,pdf},demo/stat/a}
創建的目錄結構如下:
project
  |
  | -lib
  |     |-ext
  | -bin
  | -src
  | -doc
  |    |-html
  |    |-info
  |    |-pdf
  | -demo
  |    |-stat
  |        |-a

另外多提一點,大括號擴展,同時也包括序列擴展。格式如下:
{x..y[..increment]}
其中x,y可以是字母或者數字等,increment是可選的步進值(省略時默認步進值爲1(或-1))。例如:
echo {0..10..2} => 0 2 4 6 8 10
echo {a..f..2} => a c e
echo {10..5} => 10 9 8 7 6 5


7.冒號命令

一個比較特殊的命令,什麼都不做。
我一般使用冒號來完成如下兩個工作:

1)填充if/while等語句塊

if condition
then :
else
  do-something
fi

上例中的":",什麼都不操作,非常適合編寫程序時,一時不作處理留待後期補上的情況(之所以要加上:是因爲,如果什麼都不寫的話,shell會認爲語法錯誤)

2)多行註釋

由於shell本身是沒有多行註釋的,所以我習慣使用:來構造自己的多行註釋,構造如下:
開頭是一個冒號,之後是一個空格,然後是三個引號(我一般使用單引號) 中間是註釋塊,最後用三個引號結尾。
例如:
: '''
these are some comments statements
echo "hello" is now do nothing here
'''


OK,今天先到這兒。有時間繼續。
發佈了22 篇原創文章 · 獲贊 8 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章