1. 程式人生 > >拿小本本記下的Linux Shell常用技巧(一)

拿小本本記下的Linux Shell常用技巧(一)

 

 

 

 

一.   特殊檔案: /dev/null和/dev/tty

   Linux系統提供了兩個對Shell程式設計非常有用的特殊檔案,/dev/null和/dev/tty。其中/dev/null將會丟掉所有寫入它的資料,換句換說,當程式將資料寫入到此檔案時,會認為它已經成功完成寫入資料的操作,但實際上什麼事都沒有做。如果你需要的是命令的退出狀態,而非它的輸出,此功能會非常有用,見如下Shell程式碼:

   /> vi test_dev_null.sh

   

   #!/bin/bash

   if grep hello TestFile > /dev/null

   then

      echo "Found"

   else

      echo "NOT Found"

   fi

   在vi中儲存並退出後執行以下命令:

   /> chmod +x test_dev_null.sh #使該檔案成為可執行檔案

   /> cat > TestFile

   hello my friend

   CTRL + D                            #退出命令列檔案編輯狀態

   /> ./test_dev_null.sh

   Found                                #這裡並沒有輸出grep命令的執行結果。

   將以上Shell指令碼做如下修改:

   /> vi test_dev_null.sh

   

   #!/bin/bash

   if grep hello TestFile

   then

      echo "Found"

   else

      echo "NOT Found"

   fi

   在vi中儲存退出後,再次執行該指令碼:

   /> ./test_dev_null.sh

   hello my friend                     #grep命令的執行結果被輸出了。

   Found

   

   下面我們再來看/dev/tty的用途。當程式開啟此檔案是,Linux會自動將它重定向到一個終端視窗,因此該檔案對於讀取人工輸入時特別有用。見如下Shell程式碼:

   /> vi test_dev_tty.sh

   

   #!/bin/bash

   printf "Enter new password: "   #提示輸入

   stty -echo                        #關閉自動列印輸入字元的功能

   read password < /dev/tty      #讀取密碼

   printf "\nEnter again: "          #換行後提示再輸入一次

   read password2 < /dev/tty     #再讀取一次以確認

   printf "\n"                        #換行

   stty echo                         #記著開啟自動列印輸入字元的功能

   echo "Password = " $password #輸出讀入變數

   echo "Password2 = " $password2

   echo "All Done"

   在vi中儲存並退出後執行以下命令:

   /> chmod +x test_dev_tty.sh #使該檔案成為可執行檔案

   /> ./test_dev_tty

   Enter new password:            #這裡密碼的輸入被讀入到指令碼中的password變數

   Enter again:                         #這裡密碼的輸入被讀入到指令碼中的password2變數

   Password = hello

   Password2 = hello

   All Done

二.   簡單的命令跟蹤:

   Linux Shell提供了兩種方式來跟蹤Shell指令碼中的命令,以幫助我們準確的定位程式中存在的問題。下面的程式碼為第一種方式,該方式會將Shell指令碼中所有被執行的命令列印到終端,並在命令前加"+":加號的後面還跟著一個空格。

   /> cat > trace_all_command.sh

   who | wc -l                         #這兩條Shell命令將輸出當前Linux伺服器登入的使用者數量

   CTRL + D                           #退出命令列檔案編輯狀態

   /> chmod +x trace_all_command.sh

   /> sh -x ./trace_all_command.sh #Shell執行器的-x選項將開啟指令碼的執行跟蹤功能。

   + wc -l                              #被跟蹤的兩條Shell命令

   + who

   2                                      #實際輸出結果。

   Linux Shell提供的另一種方式可以只打印部分被執行的Shell命令,該方法在除錯較為複雜的指令碼時,顯得尤為有用。

   /> cat > trace_patial_command.sh

   #! /bin/bash

   set -x                               #從該命令之後開啟跟蹤功能

   echo 1st echo                    #將被列印輸出的Shell命令

   set +x                              #該Shell命令也將被列印輸出,然而在該命令被執行之後,所有的命令將不再列印輸出

   echo 2nd echo                   #該Shell命令將不再被列印輸出。

   CTRL + D                         #退出命令列檔案編輯狀態

    /> chmod +x trace_patial_command.sh

   /> ./trace_patial_command.sh

   + echo 1st echo

   1st echo

   + set +x

   2nd echo

  

三.   正則表示式基本語法描述:

   Linux Shell環境下提供了兩種正則表示式規則,一個是基本正則表示式(BRE),另一個是擴充套件正則表示式(ERE)。

   下面是這兩種表示式的語法列表,需要注意的是,如果沒有明確指出的Meta字元,其將可同時用於BRE和ERE,否則將盡適用於指定的模式。

正則元字元模式含義用例\通常用於關閉其後續字元的特殊意義,恢復其原意。\(...\),這裡的括號僅僅表示括號。.匹配任何單個字元。a.b,將匹配abb、acb等*匹配它之前的0-n個的單個字元。a*b,將匹配ab、aab、aaab等。^匹配緊接著的正則表示式,在行的起始處。^ab,將匹配abc、abd等,但是不匹配cab。$匹配緊接著的正則表示式,在行的結尾處。ab$,將匹配ab、cab等,但是不匹配abc。[...]方括號表示式,匹配其內部任何字元。其中-表示連續字元的範圍,^符號置於方括號裡第一個字元則有反向的含義,即匹配不在列表內(方括號)的任何字元。如果想讓]和-表示其原意,需要將其放置在方括號的首字元位置,如[]ab]或[-ab],如這兩個字元同時存在,則將]放置在首字元位置,-放置在最尾部,如[]ab-]。[a-bA-Z0-9!]表示所有的大小寫字母,數字和感嘆號。[^abc]表示a、b、c之外的所有字元。[Tt]om,可以匹配Tom和tom。\{n,m\}區間表示式,匹配在它前面的單個字元重複出現的次數區間,\{n\}表示重複n次;\{n,\}表示至少重複n次;\{n,m\}表示重複n到m次。ab\{2\}表示abb;ab\{2,\}表示abb、abbb等。ab\{2,4\}表示abb、abbb和abbbb。\(...\)將圓括號之間的模式儲存在特殊“保留空間”。最多可以將9個獨立的子模式儲存在單個模式中。匹配於子模式的文字,可以通過轉義序列\1到\9,被重複使用在相同模式裡。\(ab\).*\1表示ab組合出現兩次,兩次之間可存在任何數目的任何字元,如abcdab、abab等。{n,m}(ERE)其功能等同於上面的\{n,m\},只是不再寫\轉義符了。ab+匹配ab、abbb等,但是不匹配a。+(ERE)和前面的星號相比,+匹配的是前面正則表示式的1-n個例項。 ?(ERE)匹配前面正則表示式的0個或1個。ab?僅匹配a或ab。|(ERE)匹配於|符號前後的正則表示式。(ab|cd)匹配ab或cd。[:alpha:]匹配字母字元。[[:alpha:]!]ab$匹配cab、dab和!ab。[:alnum:]匹配字母和數字字元。[[:alnum:]]ab$匹配1ab、aab。[:blank:]匹配空格(space)和Tab字元。[[:alnum:]]ab$匹配1ab、aab。[:cntrl:]匹配控制字元。 [:digit:]匹配數字字元。 [:graph:]匹配非空格字元。 [:lower:]匹配小寫字母字元。 [:upper:]匹配大寫字母字元。 [:punct:]匹配標點字元。 [:space:]匹配空白(whitespace)字元。 [:xdigit:]匹配十六進位制數字。 \w匹配任何字母和數字組成的字元,等同於[[:alnum:]_] \W匹配任何非字母和數字組成的字元,等同於[^[:alnum:]_] \<\>匹配單詞的起始和結尾。\<read匹配readme,me\>匹配readme。

   下面的列表給出了Linux Shell中常用的工具或命令分別支援的正則表示式的型別。

 grepsedviegrepawkBRE***  ERE   **

四.   使用cut命令選定欄位:

   cut命令是用來剪下文字檔案裡的資料,文字檔案可以是欄位型別或是字元型別。下面給出應用例項:

   /> cat /etc/passwd

   root:x:0:0:root:/root:/bin/bash

   bin:x:1:1:bin:/bin:/sbin/nologin

   daemon:x:2:2:daemon:/sbin:/sbin/nologin

   adm:x:3:4:adm:/var/adm:/sbin/nologin

   ... ...

    /> cut -d : -f 1,5 /etc/passwd    #-d後面的冒號表示欄位之間的分隔符,-f表示取分割後的哪些欄位

   root:root                                #這裡取出的是第一個和第五個欄位。

   bin:bin

   daemon:daemon

   adm:adm

   ... ...

    /> cut -d: -f 3- /etc/passwd      #從第三個欄位開始顯示,直到最後一個欄位。

   0:0:root:/root:/bin/bash

   1:1:bin:/bin:/sbin/nologin

   2:2:daemon:/sbin:/sbin/nologin

   3:4:adm:/var/adm:/sbin/nologin

   4:7:lp:/var/spool/lpd:/sbin/nologin

   ... ...   

   這裡需要進一步說明的是,使用cut命令還可以剪下以字元數量為標量的部分字元,該功能通過-c選項實現,其不能與-d選項共存。

    /> cut -c 1-4 /etc/passwd         #取每行的前1-4個字元。

    /> cut -c-4 /etc/passwd           #取每行的前4個字元。 

   root

   bin:

   daem

   adm:

   ... ...

    /> cut -c4- /etc/passwd           #取每行的第4個到最後字元。

   t:x:0:0:root:/root:/bin/bash

   :x:1:1:bin:/bin:/sbin/nologin

   mon:x:2:2:daemon:/sbin:/sbin/nologin

   :x:3:4:adm:/var/adm:/sbin/nologin

   ... ...

    /> cut -c1,4 /etc/passwd          #取每行的第一個和第四個字元。

   rt

   b:

   dm

   a:

   ... ...

    /> cut -c1-4,5 /etc/passwd       #取每行的1-4和第5個字元。

   root:

   bin:x

   daemo

   adm:x

五.   計算行數、字數以及字元數:

   Linux提供了一個簡單的工具wc用於完成該功能,見如下用例:

    /> echo This is a test of the emergency broadcast system | wc

   1   9   49                             #1行,9個單詞,49個字元

    /> echo Testing one two three | wc -c

   22                                        #22個字元

    /> echo Testing one two three | wc -l

   1                                          #1行

    /> echo Testing one two three | wc -w

   4                                          #4個單詞

    /> wc /etc/passwd /etc/group   #計算兩個檔案裡的資料。

   39  71 1933 /etc/passwd

  62  62 906   /etc/group

   101 133 2839 總用量

六.   提取開頭或結尾數行:

   有時,你會需要從文字檔案裡把幾行字,多半是靠近開頭或結尾的幾行提取出來。如檢視工作日誌等操作。Linux Shell提供head和tail兩個命令來完成此項工作。見如下用例:

    /> head -n 5 /etc/passwd          #顯示輸入檔案的前五行。

   root:x:0:0:root:/root:/bin/bash

   bin:x:1:1:bin:/bin:/sbin/nologin

   daemon:x:2:2:daemon:/sbin:/sbin/nologin

   adm:x:3:4:adm:/var/adm:/sbin/nologin

   lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

    /> tail -n 5 /etc/passwd            #顯示輸入檔案的最後五行。

   sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin

   mysql:x:27:27:MySQL Server:/var/lib/mysql:/bin/bash

   pulse:x:496:494:PulseAudio System Daemon:/var/run/pulse:/sbin/nologin

   gdm:x:42:42::/var/lib/gdm:/sbin/nologin

   stephen:x:500:500:stephen:/home/stephen:/bin/bash

   如果使用者想檢視不間斷增長的日誌(如服務程式輸出的),可以使用tail的-f選項,這樣可以讓tail命令不會自動退出,必須通過CTRL+C命令強制退出,因此該選項不適合用於Shell指令碼中,見如下用例:

    /> tail -f -n 5 my_server_log

   ... ...

   ^C                                        #CTRL+C退出到命令列提示符狀態。

福利福利分享

相關推薦

本本記下Linux Shell常用技巧()

        一.   特殊檔案: 

咆哮中寫出Linux Shell常用技巧(二)

  grep家族: 1. grep退出狀態: 0: 表示成功; 1: 表示在所提供的檔案無法找到匹配的pat

Linux Shell常用技巧(三)

          sed一次處理一行檔案並把輸出送往螢幕。sed

Linux Shell常用技巧(七)

下面給出find命令的主要應用示例:     /> ls -l  &nbs

Linux Shell常用技巧(八)

  1.  Linux的實時監測命令(watch):     watch 是一

周天奮戰Linux Shell常用技巧(十)

          需要說明的是,該篇Blog中絕大多數的

Linux Shell常用技巧(十二)

  1.  讀取使用者變數: read命令是用於從終端或者檔案中讀取輸入的內建命令,read命令讀

(七)Linux學習筆記-Linux常用命令-Shell常用技巧

(七)Linux學習筆記-Linux常用命令-Shell常用技巧 Shell常用技巧 < > >>輸入輸出重定向 |(管道) ; && ||(命令連線符) ''(命令替換符) ali

Linux Shell常用shell命令

tina -h 鏡像 groupadd 包括 ket mail 常用shell命令 sysconf Linux Shell常用shell命令 一、文件、目錄操作命令 1、ls命令 功能:顯示文件和目錄的信息 ls 以默認方式顯示當前目錄文件列表 ls -a 顯示所有文件包括

Linux+Shell常用命令總結

因為自己不經常使用linux的命令列工具,但是mac的終端還是經常使用的,有些命令總是要想一會或者百度一下才知道怎麼用,抽時間整理了一下常用的命令,作為筆記. 常用命令 檢視檔案操作:   ls :列出當前目錄下所有檔案和目錄   cat file:檢視檔案內容  -n:顯示行號    less file:

Linux Shell常用指令碼整理

輪詢檢測Apache狀態並啟用釘釘報警◆ #!/bin/bash shell_user="root" shell_domain="apache" shell_list="/root/ip_list" shell_row=`cat $shell_list |wc -l` function trans_

化 Java 映象的常用技巧

背景 隨著容器技術的普及,越來越多的應用被容器化。人們使用容器的頻率越來越高,但常常忽略一個基本但又非常重要的問題 - 容器映象的體積。本文將介紹精簡容器映象的必要性並以基於 spring boot 的 java 應用為例描述最小化容器映象的常用技巧。 精簡容器映象的必要性 精簡容器映象是非常必要的,下

Linux shell常用基本命令(二)

三、基本系統命令 1、檢視某個命令的幫助 man ls 顯示ls命令的幫助內容 2、顯示登陸使用者詳細資訊 w 3、顯示登陸使用者 who who am I  檢視自己的資訊 4、檢視最近登陸使用者 last 5、顯示當前日期時間 date  顯示當前日期時間 date

Linux Shell 常用shell命令(三)基本系統命令

三、基本系統命令 1、man命令 功能:檢視某個命令的幫助,如果你不知道某個命令的用法不懂,可以問他,他知道就回告訴你 例如: man ls 顯示ls命令的幫助內容 2、w命令 功能:顯示登入使用者的詳細資訊 例如: Sarge:~# w 22:06:5

Linux Shell高階技巧

一、將輸入資訊轉換為大寫字元後再進行條件判斷:       我們在讀取使用者的正常輸入後,很有可能會將這些輸入資訊用於條件判斷,那麼在進行比較時,我們將不得不考慮這些資訊的大小寫匹配問題。       /> cat > test1.sh     

Linux shell 示例(

echo -e linu 定義變量 cheng lee export let linux amd 一、環境系統:Centos6.6 x64shell:bash、sh [centos@Shell ~]$ hostname Shell [centos@Shell ~]$ ls

Linux Shell命令()簡介 變數

shell簡介 Shell本身是一個用C語言編寫的程式,它是使用者使用Unix/Linux的橋樑,使用者的大部分工作都是通過Shell完成的。Shell既是一種命令語言,又是一種程式設計語言。作為命令語言,它互動式地解釋和執行使用者輸入的命令;作為程式設計語言,它定義了各種變數和引數,並提供了

Linux常用命令()

一、cd命令(用於切換目錄的常用命令) cd /root/opt # 切換到目錄/root/opt cd ./path # 切換到當前目錄下的path目錄中,“.”表示當

Linux shell 基礎(),自己慢慢步步學

Linux shell指令碼基礎學習這裡我們先來第一講,介紹shell的語法基礎,開頭、註釋、變數和 環境變數,向大家做一個基礎的介紹,雖然不涉及具體東西,但是打好基礎是以後學習輕鬆地前提。 1. Linux 指令碼編寫基礎 ◆1.1 語法基本介紹1.1.1 開頭 程式必須

Linux Shell指令碼(

一、shell指令碼簡介        Shell 是一個用 C 語言編寫的程式,它是使用者使用 Linux 的橋樑。Shell 既是一種命令語言,又是一種程式設計語言。Shell 是指一種應用程式,這個應用程式提供了一個介面,使用者通過這個介面訪問作業系統核心的服務。業界所