在linux终端界面中用find与grep命令结合,查找代码中的宏定义或字符串变量,有时需要很长的命令长,不堪其扰。
使用说明:
复制代码代码如下:
#! /bin/bash
# 宏定义或字符串变量查找 # link:www.jbxue.com # date:2013/2/27 Usage() { echo "Usage: ${0##*/} [option] [path] search-content" echo " -S,--string search string" echo " -m,--macro search macro define" echo " -t,--typedef search typedef statement" echo " -c,--class search class declare" echo " -s,--struct search class declare" echo " -e,--extended-regexp support grep extended regular expression" echo " -i,--ignore-case ignore search-content case" echo " -h,--help display help information" echo "[Note]: If you don't specify path, default searching from current directory." } if [ $# -eq 0 ]; then Usage exit 1 fi while [ $# -gt 0 ]; do case $1 in -*) case $1 in -S|--string) # this is the default option if you don't specify any option SEARCH_TYPE="string";; -m|--macro) SEARCH_TYPE="macro";; -t|--typedef) SEARCH_TYPE="typedef";; -c|--class) SEARCH_TYPE="class";; -s|--struct) SEARCH_TYPE="struct";; -E|--extended-regexp) GREP_EXT_REG_OPTION="-E";; -i|--ignore-case) GREP_IGNORE_CASE_OPTION="-i";; -h|--help) Usage exit 0;; *) echo "Invalid usage: unknown option $1!" exit 1;; esac ;; *) if [ -d "$1" ]; then if [ -z "$SEARCH_PATH" ]; then SEARCH_PATH="$1" elif [ -z "$SEARCH_CONTENT" ]; then SEARCH_CONTENT="$1" else echo "Invalid usage: too many directory parameters!" exit 1 fi elif [ -z "$SEARCH_CONTENT" ]; then SEARCH_CONTENT="$1" else echo "Invalid usage: too many search-content parameters!" exit 1 fi ;; esac shift done GREP_EXTRAL_OPTION="-n -H --color $GREP_EXT_REG_OPTION $GREP_IGNORE_CASE_OPTION" if [ -z $SEARCH_TYPE ]; then SEARCH_TYPE="string" fi if [ -z "$SEARCH_CONTENT" ]; then # perhaps the content to be searched is a path-style name, and not specify path parameter if [ -n "$SEARCH_PATH" ]; then SEARCH_CONTENT="$SEARCH_PATH" SEARCH_PATH="." else echo "Invalid usage: no search-content parameter!" exit 1 fi fi if [ -z "$SEARCH_PATH" ]; then SEARCH_PATH="." fi SearchString() { for file in `ls`; do if [ "$file" = "." -o "$file" = ".." ]; then continue fi if [ -d $file ]; then cd ./$file # add "./" for those special directories whose name begin with "-" SearchString cd .. continue fi if grep $GREP_EXTRAL_OPTION "$SEARCH_CONTENT" "`pwd`/$file" ; then let "SEARCH_MATCH_COUNT+=1" fi done } Search() { for file in `ls`; do if [ "$file" = "." -o "$file" = ".." ]; then continue fi if [ -d $file ]; then cd $file Search cd .. continue fi case $SEARCH_TYPE in macro) if grep $GREP_EXTRAL_OPTION "#[[:space:]]*define[[:space:]]*$SEARCH_CONTENT" "`pwd`/$file" ; then let "SEARCH_MATCH_COUNT+=1" fi;; typedef) if grep $GREP_EXTRAL_OPTION "typedef.*$SEARCH_CONTENT" "`pwd`/$file" ; then let "SEARCH_MATCH_COUNT+=1" fi;; class) if grep $GREP_EXTRAL_OPTION "class.*$SEARCH_CONTENT" "`pwd`/$file" ; then let "SEARCH_MATCH_COUNT+=1" fi;; struct) if grep $GREP_EXTRAL_OPTION "struct.*$SEARCH_CONTENT" "`pwd`/$file" ; then let "SEARCH_MATCH_COUNT+=1" fi;; *) if grep $GREP_EXTRAL_OPTION "$SEARCH_CONTENT" "`pwd`/$file" ; then let "SEARCH_MATCH_COUNT+=1" fi;; esac done } pushd $SEARCH_PATH > /dev/null SEARCH_MATCH_COUNT=0 if [ "$SEARCH_TYPE" = "string" ]; then SearchString else Search fi if [ $SEARCH_MATCH_COUNT -lt 1 ]; then echo -e "No $SEARCH_TYPE matches \033[40;31m$SEARCH_CONTENT\033[0m in \033[40;31m$SEARCH_PATH\033[0m directory and its sub-directory!" fi popd > /dev/null
查找文件小工具:
复制代码代码如下:
#!/bin/bash
Usage() { echo "Usage: ${0##*/} [option] [path] filename" echo " -a,--absolute dispaly absolute path" echo " -r,--relative dispaly relative path" echo " -h,--help display this information" echo "[Note]: If you don't specify any option, -a will be used by default." } if [ $# -eq 0 ]; then echo "Invalid usage: no filename specified!" exit 1 fi while [ $# -gt 0 ]; do case $1 in -*) # ignore duplicated and conflicted options case $1 in -a|--absolute) FLAG_ABSOLUTE_PATH="true" ;; -r|--relative) FLAG_ABSOLUTE_PATH="false" ;; -h|--help) Usage exit 0 ;; *) echo "Invalid usage: unknown option $1!" exit 1 ;; esac ;; *) if [ -d "$1" ]; then if [ -z "$SEARCH_PATH" ]; then SEARCH_PATH="$1" elif [ -z "$SEARCH_FILE" ]; then SEARCH_FILE="$1" else echo "Invalid usage: too many directory parameters!" exit 1 fi elif [ -z "$SEARCH_FILE" ]; then SEARCH_FILE="$1" else echo "Invalid use: too many filename parameters!" exit 1 fi ;; esac shift done if [ -z $FLAG_ABSOLUTE_PATH ]; then FLAG_ABSOLUTE_PATH="true" fi if [ -z "$SEARCH_FILE" ]; then # perhaps the filename to be searched is a path-style name, and not specify path parameter if [ -n "$SEARCH_PATH" ]; then SEARCH_FILE="$SEARCH_PATH" SEARCH_PATH="." else echo "Invalid usage: no filename specified!" exit 1 fi fi if [ -z "$SEARCH_PATH" ]; then SEARCH_PATH="." fi SearchFile() { # In some systems, find not support -L option (find: invalid predicate '-L') if find -L /usr -maxdepth 1 -name tmp 2&> /dev/null ; then FUN_SF_FIND_L_OPTION="-L" else FUN_SF_FIND_L_OPTION="" fi if [ "$FLAG_ABSOLUTE_PATH" = "true" ]; then cd $SEARCH_PATH FUN_SF_CURRENT_PATH=`pwd`/ find $FUN_SF_FIND_L_OPTION . -type f | grep $SEARCH_FILE | sed "s,\./,$FUN_SF_CURRENT_PATH,g" | grep --color $SEARCH_FILE else find $FUN_SF_FIND_L_OPTION $SEARCH_PATH -type f | grep --color $SEARCH_FILE fi } SearchFile |