返回文章列表

正規表示式進階指令與Linux系統操作

本文探討正規表示式,從基本指令到進階用法,涵蓋集合、範圍操作、檔案指令等,並輔以程式碼範例與詳細解說。此外,文章也提供 BASH 指令與函式應用,包含命令組合、One-Liners 技巧、自定義指令等,以及進階 Linux

Linux 開發工具

正規表示式是處理文字的利器,搭配 Linux 指令更能發揮強大效能。本文從正規表示式的基本語法開始,逐步介紹進階技巧,例如使用集合定義字元範圍、利用錨點精確定位、以及透過分組與反向參照提取匹配內容。接著,文章詳述了 BASH 的各種應用,包含指令組合的邏輯運算元、簡潔的 One-Liners 技巧、以及透過函式自定義指令。最後,文章列舉了許多 Linux 系統的進階指令,涵蓋檔案操作、文書處理、網路管理等,並提供實用的範例與解說,讓讀者能快速上手並應用於日常工作中,提升工作效率。

正規表示式與進階指令詳解

正規表示式(Regular Expressions)是強大的文字搜尋工具,能夠大幅提升在檔案中尋找特定文字模式的能力。以下是一些基本與進階的正規表示式指令,能夠幫助使用者更精確地進行文字操作。

基本正規表示式指令

  • .:匹配任何單一字元(換行符除外)
  • *:匹配零個或多個前置字元
  • [...]:匹配方括號內指定的任何字元
  • [^...]:匹配不在方括號內的任何字元
  • ^:行首錨點
  • $:行尾錨點
  • \(...\):分組,通常用於組合條件
  • \<:單字開頭錨點
  • \>:單字結尾錨點
  • \n:第 n 個分組的內容

集合(Sets)範例

集合是正規表示式的擴充套件功能,可以用於精細調整搜尋文字。例如:

- `[A-Z]`:包含大寫字母 A 至 Z
- `[a-z]`:包含小寫字母 a 至 z
- `[0-9]`:包含數字 0 至 9
- `[./=+]`:包含 .(點)、/(斜線)、= 和 +
- `[-A-N]`:包含大寫字母 A 至 N 和破折號
- `[0-9 A-Z]`:包含所有大寫字母、數字和空格
- `[A-Z][a-zA-Z]`:第一個位置是大寫 A 至 Z,第二個位置是任意字母

進階正規表示式範例

以下是一些更進階的正規表示式範例,用於搜尋特定的文字模式:

- `/HelloWorld/`:匹配包含 HelloWorld 的行
- `/^HelloWorld$/`:匹配只包含 HelloWorld 的行
- `/^[a-zA-Z]/`:匹配以任意字母開頭的行
- `/^[a-z].*/`:匹配以 a-z 開頭,後面至少跟著一個字元的行
- `/1234$/`:匹配以 1234 結尾的行
- `/\(43|76\)/`:匹配包含 43 或 76 的行
- `/[0-9]*/`:匹配行中零個或多個數字
- `/^[^#]/`:如果行的第一個字元不是 #,則匹配

範圍(Ranges)操作

範圍操作允許對一行或多行執行操作。例如:

- `:$`:最後一行
- `:%`:檔案中的所有行
- `:.`:目前行
- `:n,m`:第 n 至 m 行

#### 範例程式碼:
```vim
:3,7d  " 刪除第 3 至 7 行
:.,$s/pattern/string/g  " 將目前行到檔案結尾的 pattern 替換為 string

檔案指令

以下是一些用於讀取資料到編輯器和將資料寫出編輯器的檔案指令:

- `:e file`:編輯新檔案
- `:n`:轉到下一個檔案
- `:p`:轉到上一個檔案
- `:r !cmd`:在目前行後讀取命令輸出
- `:r file`:在目前行後讀取檔案

#### 程式碼範例與解密:
```vim
:r !ls  " 在目前行後讀取 ls 命令的輸出

#### 內容解密:
1. `:r` 指令用於在目前位置插入外部命令的輸出或檔案內容。
2. `!ls` 表示執行 `ls` 命令並將其輸出插入到編輯器中。
3. 該指令適用於動態插入檔案列表或其他命令輸出。

其他指令

以下是一些雜項指令,用於執行各種功能:

- `~`:切換大小寫
- `.`:重複最後一次修改指令
- `J`:合併行
- `nJ`:合併接下來的 n 行
- `u`:復原最後一次修改
- `U`:復原對目前行的所有修改

#### 使用範例與解密:
```vim
u  " 復原最後一次修改

#### 內容解密:
1. `u` 指令能夠復原最近一次的編輯操作。
2. 該指令在誤操作時非常有用,可以快速還原之前狀態。
3. 反覆使用 `u` 可逐步復原多步操作。

Shell 功能

以下是一些 Shell 指令,用於從其他程式匯入資料並在文字編輯器中管理:

- `:! cmd`:執行 Shell 命令
- `:!! cmd`:執行 Shell 命令並將輸出插入目前行
- `:r! cmd`:插入命令的輸出

#### 使用範例與解密:
```vim
:! ps -aux  " 執行 ps -aux 命令

#### 內容解密:
1. `:!` 用於在不離開編輯器的情況下執行外部命令。
2. `ps -aux` 用於顯示系統中所有程式的詳細資訊。
3. 該功能便於在編輯過程中查詢系統狀態或執行其他任務。

設定指令

以下是一些用於組態 vi(m) 的設定指令:

- `:set all`:顯示所有設定選項
- `:set ai`:開啟自動縮排(預設 noai)
- `:set list`:顯示 tab (^l) 和行尾 ($)
- `:set nu`:顯示行號(預設 nonu)

#### 使用範例與解密:
```vim
:set nu  " 顯示行號

#### 內容解密:
1. `:set nu` 用於在編輯器中顯示行號,方便導航和修改。
2. 該設定對於編寫程式碼或處理大型檔案非常有幫助。
3. 相關設定可以寫入 `.exrc` 檔案以實作啟動時的自動組態。

BASH 指令與函式應用

BASH(Bourne-Again SHell)是一種強大的命令列介面,廣泛用於 Unix-like 作業系統中。它提供了豐富的功能和靈活性,讓使用者能夠透過組合不同的指令來完成複雜的任務。

命令組合與執行順序

在 BASH 中,可以使用不同的分隔符號將多個指令組合成一行執行。這些分隔符號決定了指令的執行順序和條件。

使用分號(;)分隔指令

使用分號可以將多個指令串聯起來,無論前一個指令是否成功執行,下一個指令都會被執行。

command_1; command_2; command_3

使用 && 運算元

&& 運算元用於在前一個指令成功執行(傳回狀態碼 0)的情況下,才執行下一個指令。

command_1 && command_2

使用 || 運算元

|| 運算元則是在前一個指令執行失敗(傳回非 0 狀態碼)的情況下,才執行下一個指令。

command_1 || command_2

自動回答提示

可以透過管道(pipe)將預設的回應輸入到指令或指令碼中,例如:

y | some_command

自定義指令

可以透過將多個指令組合在函式中來建立自定義指令。呼叫函式時,只需輸入函式名稱並傳遞引數即可。

function blue() { echo -e "\x1b[34m\x1b[1m"$@"\x1b[0m"; }

使用範例

blue "這是一個測試"

內容解密:

  • function blue() 定義了一個名為 blue 的函式。
  • echo -e 用於輸出帶有顏色的文字。
  • \x1b[34m\x1b[1m 是 ANSI 色彩程式碼,用於將文字設為藍色和粗體。
  • $@ 代表傳遞給函式的所有引數。
  • \x1b[0m 重置文字顏色。

One-Liners 應用

One-Liners 是將多個相關的指令、引數和值組合成一行,以實作特定功能或新增到自動化指令碼中的技巧。

系統指令

這些 one-liners 用於執行不同的系統級操作和功能,例如建立別名、監控程式等。

將 PATH 變數的內容展開並顯示
alias path='echo -e ${PATH//:/\\n}'

內容解密:

  • alias path='...' 定義了一個名為 path 的別名。
  • ${PATH//:/\\n} 將 PATH 變數中的冒號(:)替換為換行符號(\n),使每個路徑在新的一行顯示。
生成隨機密碼
tr -cd '[:alnum:]' < /dev/urandom | fold -w20 | head -n1

內容解密:

  • tr -cd '[:alnum:]'/dev/urandom 中過濾出字母和數字字元。
  • fold -w20 將輸入的字元每 20 個字元換行。
  • head -n1 只取第一行輸出,即生成一個 20 位的隨機密碼。

其他實用範例

簡易計算器函式

? () { echo "$*" | bc -l; }

內容解密:

  • ? () { ... } 定義了一個名為 ? 的函式,用作簡易計算器。
  • echo "$*" | bc -l 將傳遞給函式的引數(通常是數學表示式)傳給 bc 命令進行計算。

在終端視窗右上角顯示系統時間

while sleep 1;do tput sc;tput cup 0 $(($(tput cols)-29));date;tput rc;done &

內容解密:

  • while sleep 1; do ... done & 建立一個後台迴圈,每隔一秒執行一次。
  • tput sctput rc 用於儲存和還原遊標位置。
  • tput cup 0 $(($(tput cols)-29)) 將遊標移動到螢幕的右上角。
  • date 輸出當前日期和時間。

進階 Linux 指令與應用實戰

Linux 系統提供了豐富的命令列工具,讓使用者能夠高效地完成各種任務。以下將介紹一系列實用的 Linux 指令,涵蓋檔案操作、文書處理、網路管理等領域。

檔案與目錄操作

在 Linux 中,檔案和目錄的操作是基礎且重要的任務。以下是一些實用的指令:

  • 複製檔案到多個目錄:使用 echoxargs 結合,可以將檔案複製到多個指定的目錄。

    echo /path/to/directory1/ /path/to/directory2/ /path/to/directory3/ | xargs -n 1 cp /path/to/file_name.ext
    
  • 計算目錄中的檔案數量:使用 lsgrepwc 可以計算指定目錄中的檔案數量。

    ls -l /bin | grep -v ^c | wc -l
    
  • 列出系統中的所有檔案或目錄:使用 find 命令可以搜尋系統中的檔案或目錄。

    find /bin -type f | less  # 列出檔案
    find / -type d | less     # 列出目錄
    
  • 建立指定大小的檔案:使用 dd 命令可以建立一個指定大小的檔案。

    dd if=/dev/zero of=output_file.txt bs=1M count=10
    
  • 列出當天修改的檔案:結合 lsdate 命令,可以列出當天修改的檔案。

    ls -al --time-style=+%D | grep `date +%D`
    

文書處理

Linux 提供了強大的文書處理工具,以下是一些範例:

  • 提取檔案中的特定欄位:使用 awkcut 可以提取檔案中的特定欄位或字元範圍。

    awk '{print $1, $3}' input_file > output_file  # 提取第1和第3欄位
    cut -c 8-15 input_file > output_file         # 提取第8到15個字元
    
  • 替換文字:使用 sed 可以替換檔案中的文字。

    sed "s/search_word1/search_word2/g" input_file > output_file
    
  • 轉換字元:使用 tr 可以轉換字元,如將空格轉換為 tab。

    cat input_file.txt | tr ' ' '\t' > output_file.txt
    
  • 格式化輸出:使用 column 可以將輸出格式化為表格形式。

    sudo cat /etc/passwd | column -t -s :
    

網路管理

Linux 下的網路管理同樣重要,以下是一些相關指令:

  • 圖形化顯示連線主機數量:結合 netstatawk 和其他命令,可以圖形化顯示每個主機的連線數量。

    netstat -an | grep ESTABLISHED | awk '{print $5}' | awk -F: '{print $1}' | sort | uniq -c | awk '{ printf("%s\t%s\t",$2,$1) ; for (i = 0; i < $1; i++) {printf("*")}; print "" }'
    
  • 透過 HTTP 分享檔案:使用 nc 命令可以透過 HTTP 分享檔案。

    sudo nc -v -l 80 < file_name.ext
    
  • 查詢網域名稱資訊:使用 whois 可以查詢網域名稱的註冊資訊。

    whois example.com
    

網路偵錯與監控

  • 測試遠端主機的連通性:使用 curlnc 可以測試遠端主機的連通性。

    curl -s example.com:80 >/dev/null && echo Success. || echo Fail.
    nc -vz example.com 80
    
  • 顯示本機的外部 IP 位址:使用 dig 可以查詢本機的外部 IP 位址。

    dig +short myip.opendns.com @resolver1.opendns.com
    

詳細解說:

這些指令展示了 Linux 在檔案操作、文書處理和網路管理方面的強大功能。透過組合不同的命令,可以實作複雜的任務。

網路監控工具:

  • ss 命令:用於顯示網路連線狀態。
  • lsof 命令:用於檢視哪些程式正在使用特定的網路埠。

詳細解說:

這些工具對於系統管理和網路偵錯至關重要。透過瞭解如何使用這些工具,可以更好地管理和維護 Linux 系統。

Linux 系統進階指令與實用工具

在 Linux 系統管理中,掌握進階指令與工具的使用至關重要。本文將介紹一系列用於系統功能操作、檔案系統管理以及效能測試的實用指令。

系統時間與行程管理

時間同步與硬體時鐘管理

系統時間的準確性對於許多應用至關重要。可以使用 ntpdate 指令同步系統時間:

sudo ntpdate -s us.pool.ntp.org

查詢硬體時鐘的時間:

sudo hwclock

設定硬體時鐘的時間:

sudo hwclock --set --date="02/20/2020 20:20:00"

行程管理

使用 top 指令檢視目前執行的行程:

top

安裝並使用 htop 作為更強大的行程管理器:

sudo apt-get install htop
# 或
sudo yum install htop
htop

多檔案與背景任務管理

多檔案監控

使用 multitail 同時監控多個日誌檔案:

multitail /var/log_file1.log /var/log_file2.log

安裝 multitail

sudo apt-get install multitail
# 或
sudo yum install multitail

背景執行任務

使用 nohup 將任務放在背景執行:

nohup wget example.com/file_name.zip &

內容解密:

此指令會將 wget 下載任務放在背景執行,即使關閉終端機也不會停止。nohup.out 檔案會儲存執行的輸出結果。

檔案與目錄操作

建立檔案捷徑(連結)

Linux 中有兩種檔案捷徑:硬連結和軟連結。硬連結只能在同一個磁碟區內建立,而軟連結(符號連結)可以跨磁碟區。

建立硬連結:

ln file_name1 file_name2

建立軟連結:

ln -s file_name1 file_name2

內容解密:

  • 硬連結與原始檔案分享相同的檔案資料,刪除原始檔案不會影響硬連結。
  • 軟連結則是原始檔案的指標,刪除原始檔案會使軟連結失效。

搜尋與取代

使用 grep 搜尋檔案中的特定文字字串:

grep -Pri "Search_Term" /Path_to_Directory/*.log

啟用 grep 自動著色:

alias grep="grep --color=auto"

內容解密:

  • -P 引數啟用 Perl 相容的正規表示式。
  • -r 引數進行遞迴搜尋。
  • -i 引數忽略大小寫。

Midnight Commander (MC) - 簡化檔案系統導航

安裝 Midnight Commander:

sudo apt-get install mc
# 或
sudo yum install mc
mc

其他進階指令

刪除大檔案

清空大檔案內容但保留檔案:

> /path/to/large_file.log

修復錯誤解壓縮的檔案

tar ztf /path/to/file_name.tar.gz | xargs -d'\n' rm -v

檢視路徑下的所有檔案和子目錄

ls -R | grep ":$" | sed -e 's/:$//' -e 's/[^-][^\/]*\//--/g' -e 's/^/ /' -e 's/-/|/'