1. 程式人生 > >Linux——輸出重定向&特殊字元

Linux——輸出重定向&特殊字元

Appending

  • 在前面我們提到過輸出重定向:
echo "This is all a dream..." > dream.txt
  • 如果dream.txt存在,執行上述語句將會覆蓋之前的內容。如果這個dream.txt不存在,那麼會自動新建一個dream.txt檔案,將上述字串新增進去。這整個過程牽扯了從命令的標準輸出(standard output)到檔案的標準輸入(standard input)。
  • 如果我們不想覆蓋原有的dream.txt,我們可以使用兩個>>:
echo "Wake up!" >> dream.txt
  • 看個例子:
~$ echo "99 bottles of beer on the wall..."
> beer.txt ~$ echo "Take one down,pass it around,98 bottles of beer on the wall..." >> beer.txt ~$ nano beer.txt 99 bottles of beer on the wall... Take one down,pass it around,98 bottles of beer on the wall...

Redirecting From A File

  • 上面一個例子是從命令重定向到檔案,現在我們看看怎麼從檔案重定向到命令,這牽扯到從檔案的標準輸出到命令的標準輸入。

  • Linux排序命令sort將檔案中的每行資料按字母順序排列的。如果新增-r標識,將會反向排列。

~$ sort -r < beer.txt                                                           
Take one down,pass it around,98 bottles of beer on the wall...                  
99 bottles of beer on the
wall...

The Grep Command

  • 有的時候我們需要在幾個檔案中查詢我需要的內容,Linux中 grep這個命令就是實現這個功能的。
~$ echo "Coffee is almost as good as beer,But I could never drink 99 bottles of 
it" > coffee.txt                                                                

這裡寫圖片描述

Special Characters

  • 倘若我們想在很多個檔案中查詢某些文字,那麼我們需要一一將其列舉出來,顯然這是很不現實的,比如有下面這些檔案:
beer1.txt
beer2.txt
  • 我們可以使用這個字元作為佔位符,它可以是任意字元(不包括空字元,意思是不匹配beer.txt檔案):
beer1.txt:beers are lots of beer                                                
beer2.txt:I do not like beer 

這裡寫圖片描述

The Star Wildcard

  • 星號也是一個萬用字元(Wildcard),此時是可以匹配任意字元,包括空(以為上面那個句子可以匹配beer.txt檔案)。並且比更強大,因為它可以匹配任意長度的字串,比如.txt是匹配任意的txt檔案。

這裡寫圖片描述

Piping Output

管道輸出(Piping Output)字元 | 使得一個命令的標準輸出可以通過管道傳送到另一個命令的的標準輸入,在連結命令時很有用。

  • 比如現在我們有一個1000行的檔案log.txt,我需要查詢其最後10行是否有”error”這個字串,首先需要使用tail -n 10 logs.txt獲取文字的最後十行,這個命令產生了一個標準輸出,然後我們需要將其傳送到grep “Error”命令的標準輸入中,使用 | 這個字元就可以搞定啦:
tail -n 10 logs.txt | grep "Error"
  • 我們也可以將一個Python指令碼的標準輸出傳送出來,比如現在有個指令碼rand.py,內容如下:
import random
for i in range(10000):
    print(random.randint(1,10))
  • 然後將其標準輸出傳送到一個查詢命令的標準輸入中:
echo -e "import random\nfor i in range(10000):\n    print(random.randint(1,10))\n" > rand.py
python rand.py | grep 9
  • 上面這段程式碼將打印出所有的9,總共1000個

Chaining Commands

  • 如果我們想讓兩行命令按順序執行,我們可以使用&&將命令連結起來。比如:
echo "All the beers are gone" >> beer.txt && cat beer.txt
  • 上面這段程式碼首先會將All the beers are gone儲存到beer.txt檔案中去,然後會列印beer.txt的所有內容。只有當第一條命令執行完畢後,&&才會去執行第二條命令。如果第一條執行出錯,就會報錯,不會繼續執行第二條。
~$ echo "beer is not a goo thing" >> beer.txt && cat beer.txt                   
99 bottles of beer on the wall...                                               
Take one down, pass it around, 98 bottles of beer on the wall...                
beer is not a goo thing

Escaping Characters

  • 所有的特殊字元都在這裡,當你在字串或者命令中使用這些特殊字元時,不想對原有字串中正常字元有影響,因此需要轉義字元。轉轉義字元會告訴shell不用將這個字元作為特殊字元對待,比如:
echo ""Get out of here," said Neil Armstrong to the moon people." >> famous_quotes.txt
  • 上面這段語句由於“的原因不會正常執行,因此需要轉義字元(\)”
echo "\"Get out of here,\" said Neil Armstrong to the moon people." >> famous_quotes.txt
  • 向檔案中新增兩個”“
~$ echo "\"\"" > zm.txt                                     
~$ cat zm.txt                                               
""