我學shell程式的記錄

來源:互聯網
上載者:User
1. 將目前的目錄下的檔案去除尾碼名".sh"
for i in `ls .`
 do
   mv -v $i `echo ${i%%.sh}`
 done

2.shell中在列檔案目錄時防止帶空格的檔案名稱被顯示成2個檔案帶空格的檔案名稱變數不被當成兩個參數

ls -1 目錄路徑 | while read line
do
echo $line
done

解釋:ls後面的-1是用來讓檔案每行只顯示一個,然後我們依次讀取這些行,這樣就能把指定目錄下的檔案依次賦給變數$line,然後使用變數$line就行了。
其他情況下對於帶有空格情況的處理方式就是對變數加上雙引號:
如 rm -r "$a"
3. 統計目錄下檔案的數目
(1)查看檔案夾下的檔案個數(目前的目錄的檔案數)
 ls   -l   |grep   "^-"   |   wc   -l   
說明:
 ls   -l   長列表輸出該目錄下檔案資訊(注意這裡的檔案,不同於一般的檔案,可能是目錄、連結、裝置檔案等)   
grep   ^-   這裡將長列表輸出資訊過濾一部分,只保留一般檔案,如果只保留目錄就是   ^d   
wc   -l   統計輸出資訊的行數,因為已經過濾得只剩一般檔案了,所以統計結果就是一般檔案資訊的行數,又由於一行資訊對應一個檔案,所以也就是檔案的個數。
(2)查看檔案夾下的所有檔案個數(目前的目錄的檔案和子檔案夾的檔案數)

find   ./   -type   f   |   wc   -l
或者
ls   -lR|grep   "^-"|wc   -l

4.  在一個目錄中搜尋某個字串, 使用grep的-r命令, 即 grep -r string $dirpath
5. gcc 中需要在編譯的時候加上一個預定義的宏的話需要使用命令-D, 即:gcc -DMYDEBUG -g -o a1 a.c
6. 我們平時使用Linux的時候經常遇到這樣一個問題,舉例有這樣一種情況:執行命令
$ cp /etc/apt/sources.list /etc/apt/sources.list.bak
這 裡面有個問題,明明 /etc/apt/sources 這幾個字都是一樣的,為什麼要打兩遍?這樣的還算短了,要是更深層的目錄,那花的力氣可就大了。跟上面例子很相似的情況是:在備份一個檔案,重新命名一個文 件,或是建立一個連結,都要進行類似的操作,重複一個相同的路徑。通常比較明智的做法是先 cd 到那個目錄,然後在那個目錄下進行操作,完後再 cd 回來。不過這樣做還是比較麻煩,有沒有足不出戶的解決方案?答案是肯定的。
Bash 有個功能叫大括弧擴充,大括弧包圍的,用逗號隔開的參數會擴充為獨立的多個參數。具體一點,上面那個備份檔案的例子可以寫成:
$ cp /etc/apt/sources.{list,list.bak}
Shell 在解釋時會自動將後面的參數擴充成兩個,就變成了和上面一樣的完整命令。這樣就實現了足不出戶操作,而前面那一串目錄只要打一次就行,連 cd 也免敲了。
再繼續簡化就是:
$ cp /etc/apt/sources.list{,.bak}
這樣逗號前面沒東西,那麼參數就保持原來的不變,逗號後面的照樣擴充。
7.awk中的內建變數

FNR                當前輸入檔案的記錄數
FS                  欄位分隔字元 (預設為: " ")
NF                   目前記錄的欄位數
NR                  在工作(job)中的記錄數
OFS                輸出欄位分隔字元(預設為: " ")
ORS                輸出記錄分隔字元(預設為: "\n")
RS                  輸入記錄分隔字元(僅用於 gawk 與 mawk)
ARGC             命令列參數的數目
ARGIND          命令列中當前檔案在 ARGV 內的索引
CONVFMT       數字轉換格式,預設為 %.6gd
ENVIRON          包含當前 shell 環境變數的數組
FILEDWIDTHS    在分隔固定寬度的列表時,使用空白而不是 FS 進行分割的欄位寬度列表
FILENAME          當前輸入檔案的檔案名稱
IGNORECASE     在Regex和字串匹配中不區分大小寫
OFMT                 數位輸出格式
RLENGTH            match 函數匹配到的字串的長度
RSTART             match 函數匹配到的字串的位移量
RT              記錄終結符,對於匹配字元或者用 RS 指定的正則,gawk 將 RT 設定到輸入文本
SUBSEP                數組下標分隔字元

8 shell中萬用字元與Regex的區別

萬用字元    表達的含義    Regex
*    匹配 0 或多個字元        .*
?    匹配任意單一字元      .
[a-z]    匹配a-z中的任意單一字元     [a-z]
[!a-z]    匹配不在a-z中的任意單一字元,! 注意區別 ^    [^a-z]
{string1,string2,...}    匹配 sring1或string2其一字串    string1|string2

萬用字元是系統級的,而Regex需要相關工具的支援: egrep, awk, vi, perl
9.讀取檔案中的每一行的方法:
(1)在for迴圈中

#! /bin/bash
 IFS=" "
 n=0  
 for line in `cat /etc/passwd`  
 do  
         n=`expr $n + 1`  
         echo -e "$n/t$line"  
 done  

 (2) while迴圈中

#! /bin/bash
n=0
while read line
do
        n=`expr $n + 1`
        echo -e "$n/t$line"
done < /etc/passwd    

#! /bin/bash
n=0
cat /etc/passwd | while read line
do      
        n=`expr $n + 1`
        echo -e "$n/t$line"
done

while迴圈的方式要比for迴圈好,因為for迴圈對於一行中存在空格的情況處理的不好。
對於while迴圈和for迴圈的不同的地方是在迴圈控制上,while後跟的是一個條件陳述式,而for後面一般是“變數 in 名字列表”的形式
10. 向sed或awk中傳入參數的方法
sed -n "$rowS"','"$rowE"'p' mv.txt |awk -v colS1=$colS1 -v colS2=$colS2 -v colS3=$colS3 -v colS4=$colS4 '{print $colS1 $colS2 $colS3 $colS4}'
從上面可以看到sed與awk的不同,sed是類似將字串進行組合的方法得到命令,而awk則使用-v選項來說明使用外部的變數來傳遞參數
 11.shell中同時對多個檔案的讀寫
(1)一個檔案分割成多個
有時需要提取檔案中的一個或多個列元素產生新的檔案,這一操作在Shell裡很容易實現。比如有一個資料檔案data,有三列資訊:姓名、學號、班級。
    redraiment 0612800134 0601
    christine 0612800136 0601
    zb    0612800229 0602
現在需要這個檔案的第一列和第二列資訊分別存到檔案f1和f2中,可以用awk提取,也可以用下面這個簡單shell程式:

#!/bin/sh
while read f1 f2 f3
do
echo $f1 >> f1
echo $f2 >> f2
done

(2) 多個檔案合并成一個檔案
如果想把多個檔案重新合并成一個多列檔案,而不是追加到檔案尾處。例如把上列中產生的f1和f2重新組成join.txt。這時需要同時操作多個檔案,就 像C語言中用fopen同時開啟多個檔案,在shell裡也是類似的。只是在shell裡叫做“檔案描述符”,用“0-9”十個數字表示。其中0、1、2 分別是系統的標準輸入、輸出、錯誤。“3-9”則由使用者只有使用。我們就可以任選兩個來重新導向輸入。指令碼如下:

#!/bin/sh
exec 3<f1
exec 4<f2
while read f1 <&3 && read f2 <&4
do
echo $f1 $f2 >> join.txt
done

這兒其實也告訴我們如何同時讀取多個檔案的方法。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.