首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

Shell 文本搜尋實戰:find/xargs、grep 與自定義腳本三種方案詳解

     編輯:關於C語言

方案一:find + xargs 組合

遞迴搜尋目錄下所有文件:

find dir | xargs grep "pattern"
find file | xargs grep "pattern"

特點:預設遞迴子目錄;xargs 批量構建參數列表,效率高;需注意文件名含空格時需 -print0 | xargs -0。

方案二:grep 內建遞迴

grep "pattern" dir/*        # 僅當前目錄
grep -r "pattern" dir/*     # 遞迴子目錄 (-r / -R)
grep "pattern" file         # 單文件

特點:語法簡潔,-r 直接支援遞迴,無需管道;-i 忽略大小寫,-n 顯示行號,-l 僅列文件名。

方案三:自定義 Shell 腳本

整合上述功能,支援目錄/文件自適應、遞迴開關、大小寫開關:

#!/bin/bash
# find_str.sh  path pattern [-r] [-i]

if [ $# -lt 2 ]; then
    echo "Usage: $0 path pattern [-r] [-i]"; exit 1
fi

path=$1; pattern=$2; shift 2
dir_op=""; lu_op=""

for opt in "$@"; do
    case $opt in
        -r) dir_op="-r" ;;
        -i) lu_op="-i" ;;
        *) echo "invalid option: $opt"; exit 1 ;;
    esac
done

grep_file() {
    local file=$1 str=$2
    local out=$(grep -n $lu_op "$str" "$file" 2>/dev/null)
    [ -n "$out" ] && [ "$file" != "$0" ] && echo "$file: $out"
}

find_str() {
    local target=$1 str=$2
    if [ -d "$target" ]; then
        for f in "$target"/*; do
            if [ "$dir_op" = "-r" ] && [ -d "$f" ]; then
                find_str "$f" "$str"
            elif [ -f "$f" ]; then
                grep_file "$f" "$str"
            fi
        done
    elif [ -f "$target" ]; then
        grep_file "$target" "$str"
    fi
}

find_str "$path" "$pattern"

使用範例

./find_str.sh /usr/include main           # 非遞迴、大小寫敏感
./find_str.sh /usr/include main -i        # 非遞迴、忽略大小寫
./find_str.sh /usr/include main -r        # 遞迴、大小寫敏感
./find_str.sh /usr/include main -r -i     # 遞迴、忽略大小寫
./find_str.sh main.cpp main               # 檔案搜尋

進階擴展建議

  • 用 sed 替換 grep 實現替換/格式化輸出。
  • 加入 wc -l 統計匹配行數。
  • 支援 -E 擴展正則、-w 全字匹配。
  • 大規模代碼庫建議使用 ripgrep (rg) / ag,速度遠超 grep。

總結

掌握 find/xargs、grep -r 兩大核心組合,覆蓋 90% 搜尋需求。自定義腳本封裝常用參數,提升日常開發效率。大型專案請升級現代工具(rg/ag)獲得最佳體驗。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved