天天看點

Shell---Shell常用指令(tr、sed、cut)trsedcut

版權聲明:本文為部落客原創文章,轉載請注明出處。 https://blog.csdn.net/twilight_karl/article/details/78374526

tr

tr 指令用于轉換或删除檔案中的字元。從标準輸入裝置讀取資料,經過字元串轉譯後,将結果輸出到标準輸出裝置。

tr [-cdst][--help][--version][第一字元集][第二字元集]

參數:

- -c, –complement:反選設定字元。也就是符合 SET1 的部份不做處理,不符合的剩餘部份才進行轉換

- -d, –delete:删除指令字元

- -s, –squeeze-repeats:縮減連續重複的字元成指定的單個字元

- -t, –truncate-set1:削減 SET1 指定範圍,使之與 SET2 設定長度相等

- –help:顯示程式用法資訊

- –version:顯示程式本身的版本資訊

# 将所有小寫字元轉換成大寫
cat testfile |tr a-z A-Z 

# 壓縮多個空格為1個
echo "fdas     fadsfaf" | tr -s " "

# 把檔案中的數字0-9替換為a-j
cat file | tr [0-9] [a-j]

# 删除檔案file中出現的換行'\n'、制表'\t'字元
cat file | tr -d "\n\t"           

sed

sed [-nefri] ‘command’ 輸入文本

  • -n∶使用安靜(silent)模式。在一般 sed 的用法中,所有來自 STDIN的資料一般都會被列出到螢幕上。但如果加上 -n 參數後,則隻有經過sed 特殊處理的那一行(或者動作)才會被列出來。
  • -e∶直接在指令列模式上進行 sed 的動作編輯;
  • -f∶直接将 sed 的動作寫在一個檔案内, -f filename 則可以執行 filename 内的sed 動作;
  • -r∶sed 的動作支援的是延伸型正規表示法的文法。(預設是基礎正規表示法文法)
  • -i∶直接修改讀取的檔案内容,而不是由螢幕輸出。
  • a ∶新增, a 的後面可以接字串,而這些字串會在新的一行出現(目前的下一行)
  • c ∶取代, c 的後面可以接字串,這些字串可以取代 n1,n2 之間的行!
  • d ∶删除,d後面不接參數
  • i ∶插入, i 的後面可以接字串,而這些字串會在新的一行出現(目前的上一行);
  • p ∶列印,亦即将某個選擇的資料印出。通常 p 會與參數 sed -n 一起運作
  • s ∶取代,可以直接進行取代的工作,例如 1,20s/old/new/g 就是啦!

替換一行中的某部分

  • 格式:

    sed 's/要替換的字元串/新的字元串/g'

    (要替換的字元串可以用正規表達式)
# ab 為檔案名
    删除某行
     [root@localhost ruby] # sed '1d' ab             #删除第一行 
     [root@localhost ruby] # sed '$d' ab             #删除最後一行
     [root@localhost ruby] # sed '1,2d' ab           #删除第一行到第二行
     [root@localhost ruby] # sed '2,$d' ab           #删除第二行到最後一行

  顯示某行
.    [root@localhost ruby] # sed -n '1p' ab          #顯示第一行 (如果不加-n就會全部顯示)
     [root@localhost ruby] # sed -n '$p' ab          #顯示最後一行
     [root@localhost ruby] # sed -n '1,2p' ab        #顯示第一行到第二行
     [root@localhost ruby] # sed -n '2,$p' ab        #顯示第二行到最後一行

  使用模式進行查詢
     [root@localhost ruby] # sed -n '/ruby/p' ab    #查詢包括關鍵字ruby所在所有行
     [root@localhost ruby] # sed -n '/\$/p' ab      #查詢包括關鍵字$所在所有行,使用反斜線\屏蔽特殊含義

    #第一行後增加字元串"drink tea"
    sed '1a drink tea' ab  

    #第一行到第三行後增加字元串"drink tea"
    sed '1,3a drink tea' ab 

    #第一行後增加多行,使用換行符\n
    sed '1a drink tea\nor coffee' ab   

    #第一行代替為Hi
    sed '1c Hi' ab    

    #第一行到第二行代替為Hi            
    sed '1,2c Hi' ab             

    #替換ruby為bird
    sed -n '/ruby/p' ab | sed 's/ruby/bird/g' 

    # 替換 \#!為23333   
    cat cal.sh | sed -n "s/#\!/23333/g" 

    # 将\#!替換成空,即删除這兩個字元
    cat cal.sh | sed "s/#\!//g" 

    #在檔案ab中最後一行直接輸入"bye"
    sed -i '$a bye' ab                    

cut

cut 指令從檔案的每一行剪切位元組、字元和字段并将這些位元組、字元和字段寫至标準輸出。如果不指定 File 參數,cut 指令将讀取标準輸入。必須指定 -b、-c 或 -f 标志之一。

不能處理多空格為分隔符的行

cut  [-bn] [file]
cut [-c] [file]
cut [-df] [file]           
  • -b :以位元組為機關進行分割。這些位元組位置将忽略多位元組字元邊界,除非也指定了 -n 标志。
  • -c :以字元為機關進行分割。
  • -d :自定義分隔符,預設為制表符。
  • -f :與-d一起使用,指定顯示哪個區域。
  • -n :取消分割多位元組字元。僅和 -b 标志一起使用。如果字元的最後一個位元組落在由 -b 标志的 List 參數訓示的範圍之内,該字元将被寫出;否則,該字元将被排除
# 提取每行的第三個字元
who | cut -b 3

# 提取第3,第4、第5和第8個位元組
who|cut -b 3-5,8

# 以 `:`為分隔符,選取第一個
cat /etc/passwd | cut -d ":" -f 1           

當有多個空格為分隔符時,可用awk指令

# 選出第一列(以多個空格分隔)
[root@localhost sh]# ll | awk '{print $1}'
-rwxr-xr-x.
-rwxr-xr-x.
-rwxr-xr-x.