1. 程式人生 > >2017-11-5Linux基礎知識(10)bash基礎特性

2017-11-5Linux基礎知識(10)bash基礎特性

linux 基礎


在上一章中我們講述了bash基礎特性之命令補全和路徑補全以及它的命令引用,以及講了文件管理命令,例如:復制、移動和刪除,然後我們也講述了變量,主要圍繞著存儲格式、數據範圍和參與運算。那麽這次我們繼續講述bash的基礎特性,這一次我們講述的是文件的通配符和IO重定向等。

一、globbing:文件名通配

我們在查詢某些文件的時候,通常是在該目錄下進行查找,有的時候文件繁多,想找一些特定的文件就得從該目錄下逐個匹配進行查找進行通配,如果沒找到則顯示為空,找到的話就在下面顯示該匹配結果的文件或目錄,那麽我們就需要一個用一些普通字符來賦予它們特殊的意義,比如說在文件系統中匹配單個的,或者匹配整個的,一旦賦予特殊的意義之後,則就不能對其進行普通字符處理,而是用特殊字符來進行字符匹配,這就是globbing文件通配機制,它是對整體文件名進行匹配,而非部分。

那麽glob也有它的匹配模式,剛才我們也談到過,用一些普通字符來賦予它特殊的意義,用來對文件或目錄進行匹配,這就是它的匹配模式,那麽匹配模式的示例如下:

  *:匹配任意長度的任意字符;
    pa*, *pa*, *pa, *p*a
    pa, paa, passwd
  ?:匹配指定範圍內的任意單個字符
    [a-z], [A-Z], [0-9], [a-z0-9]
     有幾種特殊格式:
    [[:upper:]]:所有大寫字母;
    [[:lower:]]:所有小寫字符;
    [[:alpha:]]:所有數字;
    [[:digit:]]:所有數字;
    [[:alnum:]]:所有的字母和數字;
    [[:space:]]:所有的空白符號;
    [[:punct:]]:所有的標點符號;
  [^]:匹配指定範圍外的任意的單個字符;
    [^[:upper:]]
    [^[0-9]]
    [^[:alnum:]]

那麽接下來我們有以下的練習題:
1、顯示/var目錄下所有以1開頭,以一個小寫字母結尾,且中間出現一位任意字符的文件或目錄

  # ls /var/1?[[:lower:]]

2、顯示/etc/目錄下,以任意數字開頭,且非數字結尾的文件或目錄

  # ls -d /etc/[[:alnum:]]*[^[:alnum:]]
  # ls -d /etc/[0-9]*[^0-9]

3、顯示/etc目錄下,以非字母開頭,後面跟著一個字母,以及其它任意字符的文件或目錄

  # ls -d /etc [^a-z][a-z]*

4、復制/etc目錄下,所有以m開頭,以非數字結尾的文件或目錄至/tmp/admin目錄

  # cp -r /etc m*[^0-9] /tmp/admin

5、復制/usr/share/man目錄下,所有以man開頭,後跟一個數字結尾的文件或目錄至/tmp/man目錄下

  # cp /usr/share/man/man[[:digit:]] /tmp/man

6、復制/etc目錄下,所有以.conf結尾,且以m,n,r,p開頭的文件或目錄/tmp/conf.d目錄下

  # cp -r /etc [mnrp]*.conf /tmp/conf.d

二、IO重定向及管道

IO重定向簡單來講就是輸入輸出重定向,在計算機元器件中,都IO設備,那麽就稱之為輸入輸出設備,其實輸入輸出的設備有很多,其中,顯示器是最廉價的一種輸出設備,早期的輸出是通過打印來輸出,不能實時看到結果,後來有顯示器可以實時傳送,但是輸出結果並不能往前翻閱查找,所以IO重定向的功能就是,將默認的輸出結果設備重定向到其它的任何的文件或設備當中去。
我們都知道Linux的哲學思想之一就是一切皆文件,輸入和輸出設備也是文件,那麽可用於輸入的設備:文件,分為鍵盤設備、文件系統上常規文件和網卡等,可用於輸出設備也是文件,通常是顯示器、文件系統上的常規文件、網卡等。
那麽在程序當中的數據流分為三種:一種是標準的數據流:<-- (符號) 我們稱之為標準輸入(stdin),通常為鍵盤設備,另一種是輸出的數據流:--> 我們稱之為標準輸出流(stdout),最常見的就是剛才講的顯示器。還有一種是錯誤的輸出流:--> 我們稱為錯誤輸出(stderr),默認也是顯示器輸出,所以我們可以總結一下:

  程序的數據流有三種:
	輸入的數據流: <-- 標準輸入(stdin),鍵盤;
	輸出的數據流: --> 標準輸出(stdout),顯示器;
	錯誤的輸出流: --> 錯誤輸出(stderr),顯示器;

還有就是我們的設備上都有其文件描述符,每一個設備有不同的文件描述符都標識著設備的唯一,輸入輸出設備也是如此,所以在標準輸出設備上標識為0,標準輸出標識為1,而錯誤輸出標識為2。

fd:file descriptor,文件描述符
	標準輸入:0
	標準輸出:1
	錯誤輸出:2

2.1 IO重定向

如果我們將某一個輸出的結果默認顯示的設備重定向到另一個設備當中,我們需要使用>,它就是輸出重定向,其特性為覆蓋輸出,還有一種特性是追加輸出的重定向,我們使用>>

  輸出重定向:>
	特性:覆蓋輸出;
  輸出重定向:>>
	特性:追加輸出;

相對這種特性來說,前者直接覆蓋是比較危險,所以請三思後而行,不過我們可以把這個覆蓋的特性進行關閉,我們使用set命令就可以。

  # set -C
	禁止覆蓋輸出重定向至已存在的文件;
	此時可使用強制覆蓋輸出:>
  # set +C
	關閉上述特性;

另一種就是錯誤的輸出流重定向,我們在>>>之前都加個2,便成了2>2>>,在上一節我們講過其文件描述符的錯誤輸出為2,需要註意的是,正確的結果並不會重定向到目標文件或設備中,反之使用輸出重定向,其錯誤結果也不能重定向到目標設備或文件中,都是默認顯示。不過我們可以將正確輸出和錯誤輸出重定向合並為正常輸出流和錯誤輸出流,顯示方法如下:

   (1) &>, &>>
   (2) COMMAND > /PATH/TO/SOMEFILE 2&>1
    COMMAND >> /PATH/TO/SOMEFILE 2&>1

註意:&指的是有當前屏幕輸出的結果轉移到後臺輸出。
還有一種特殊設備在/dev目錄下,設備名稱叫做null,為空的意思,就是我們將所有數據都重定向到這裏的話,無疑於刪除,一旦刪除就找不到,可以理解為是一個黑洞。
以上就是輸出重定向,還有輸入重定向,符號為
<,另一種為<<,我們稱之為Here Document,用法如下:

   # cat << EOF
   # cat > /PATH/TO/SOMEFILE << EOF

三、一些常用命令

我們介紹一下tr命令,tr命令是把輸入的字符進行轉換,凡是在SET1定義範圍內出現的,通通對位轉換為SET2出現的字符。它是從標準輸入中替換、縮減和(或)刪除字符,並將結果寫到標準輸出。其用法如下:

   用法1:
	# tr [OPTIONS]... SET1 [SET2]
   用法2:
	# tr -d SET1 < /PATH/TO/SOMEFILE
	-d:刪除匹配SET1的內容,而不作替換

需要註意的是:這個命令不修改源文件。

四、管道

管道是一個命令與命令之間的連接程序,它的原理是將COMMAND1的輸出結果通過管道傳遞到COMMAND2,實現將前一個命令的輸出直接定向後一個程序並當作其數據流。用法如下:

   # COMMAND1 | COMMAND2 | COMMAND3

那麽我們接下來說一下tee命令,tee命令就是用來將標準輸入的內容輸出到標準輸出並可以保存其文件。用法如下:

   # COMMAND | tee /PATH/TO/SOMEFILE

練習1:把/etc/passwd文件前6行的信息轉換為大寫字符後輸出

   # head -n6 /etc/passwd  | tr ‘a-z‘ ‘A-Z‘

本文出自 “天蠍座” 博客,轉載請與作者聯系!

2017-11-5Linux基礎知識(10)bash基礎特性