Shell bash脚本自动搜索代码中的字符串,包括子文件夹
我一直在使用tail、head和grep的组合来打印与我相关的代码。它帮助我找到函数并直接切入要点。我一天大约做30到40次,所以我想我应该在这方面寻求一些帮助,因为我不擅长sh脚本Shell bash脚本自动搜索代码中的字符串,包括子文件夹,shell,grep,head,tail,cat,Shell,Grep,Head,Tail,Cat,我一直在使用tail、head和grep的组合来打印与我相关的代码。它帮助我找到函数并直接切入要点。我一天大约做30到40次,所以我想我应该在这方面寻求一些帮助,因为我不擅长sh脚本 我最终喜欢的命令格式类似于giveme“searchstring”-nn您可以尝试以下脚本: #!/bin/bash shopt -s extglob SEARCHDIR_DEFAULT="./" read -ep "Enter search directory [$SEARCHDIR_DEFAULT]: "
我最终喜欢的命令格式类似于giveme“searchstring”-nn您可以尝试以下脚本:
#!/bin/bash
shopt -s extglob
SEARCHDIR_DEFAULT="./"
read -ep "Enter search directory [$SEARCHDIR_DEFAULT]: " SEARCHDIR
[[ $SEARCHDIR =~ ^[[:space:]]*$ ]] && SEARCHDIR=$SEARCHDIR_DEFAULT
for (( ;; )); do
read -p "Enter search item: " SEARCHITEM
read -p "Enter number of lines to display: " NUMLINES
readarray -t MATCHEDFILES < <(exec grep -rl "$SEARCHITEM" "$SEARCHDIR")
echo "Please select a file to search into. Press C to cancel, or X to exit."
select FILE in "${MATCHEDFILES[@]}"; do
if [[ -n $FILE ]]; then
readarray -t MATCHEDLINES < <(exec grep -n "$SEARCHITEM" "$FILE")
echo "Please select starting line."
select LINE in "${MATCHEDLINES[@]}"; do
if [[ -n $LINE ]]; then
LINENUM=${LINE%%:*}
tail -n "+$LINENUM" "$FILE" | head -n "$NUMLINES"
elif [[ $REPLY == [cC] ]]; then
break
elif [[ $REPLY == [xX] ]]; then
break 3
fi
done
elif [[ $REPLY == [cC] ]]; then
break
elif [[ $REPLY == [xX] ]]; then
break 2
fi
done
done
#/bin/bash
shopt-s extglob
SEARCHDIR_DEFAULT=“./”
阅读-ep“输入搜索目录[$SEARCHDIR\u默认]:”SEARCHDIR
[[$SEARCHDIR=~^[:space:]*$]&&SEARCHDIR=$SEARCHDIR\u默认值
对于(;);做
阅读-p“输入搜索项:”搜索项
读取-p“输入要显示的行数:”NUMLINES
readarray-t MATCHEDFILES<试试这个,如果我理解正确,它应该是你想要的:
# Usage: giveme searchstring [numlines]
find . -type f -exec awk -v n=${2:-10} '
/'"$1"'/ {
printf("==== %s ====\n",FILENAME);
for(i=0;i<n;i++)
{
printf("%4d: %s\n",FNR,$0);
getline
}
}' {} +
#用法:giveme searchstring[numlines]
找到-类型f-exec awk-v n=${2:-10}'
/'"$1"'/ {
printf(“=%s==\n”,文件名);
对于(i=0;请看我的答案。另外,你真的想在文本文件中显示没有匹配模式的行吗?tail-n+line./filename | head-numberoflinestodisplay
@konsolebox我没有匹配模式,我只是在grep-n找到字符串的行后显示x行。因为我不知道字符串的长度函数是,我说,显示我说30行的文件后$TAILLINES@konsolebox每天仍在使用此脚本!感谢您对脚本的帮助!!很高兴知道!欢迎:)我想你错过了尾部-n**+**##的作用,当我添加一个+符号时,它从文件的顶部而不是结尾开始,因此它实际上从grep返回的行开始。我在你的代码SEARCHDIR_DEFAULT=“./”和tail-n+“$TAILLINES”“$file”| head-n“$NUMLINES”中更改了以下内容,但是我需要一个搜索函数来获取grep-n输出中第一个实例:之前的数字,这些数字将成为变量“$TAILLINES”对于那个文件。@Faruq我知道我做了更新。如果对你有效,请点击左边的复选标记接受答案。如果缺少任何东西,请发回。@Faruq数字很多。如何选择用于尾线的数字?还是我们要计算输出?她很漂亮。谢谢,效果很好。我想知道当它为我节省了大量的工作时间时,我就去报道,结果我玩得太多了。她让我的工作更有趣。谢谢你,不用客气。这个脚本做了你所期望的吗?如果没有,请告诉我遗漏了什么。这正是我所期望的,尽管坦率地说,konsolebox的布局只是呈现了一种形式让浏览不同的文件更有趣。你很有钱。
jezzy@forum:/var/www/sgs# tail -n +289 ./bin/ext/js/functions_edit.js | head -30
function insert_into_selectbox(selectbox,text,value,selected) {
if (text=="" || value=="") return;
var obj = getObj(selectbox);
var index = _selectbox_find(obj, value);
if (index == -1) {
index = obj.options.length;
obj.options[index] = new Option(text,value);
}
if (!obj.multiple && selected) obj.options[index].selected = true;
}
#!/bin/bash
shopt -s extglob
SEARCHDIR_DEFAULT="./"
read -ep "Enter search directory [$SEARCHDIR_DEFAULT]: " SEARCHDIR
[[ $SEARCHDIR =~ ^[[:space:]]*$ ]] && SEARCHDIR=$SEARCHDIR_DEFAULT
for (( ;; )); do
read -p "Enter search item: " SEARCHITEM
read -p "Enter number of lines to display: " NUMLINES
readarray -t MATCHEDFILES < <(exec grep -rl "$SEARCHITEM" "$SEARCHDIR")
echo "Please select a file to search into. Press C to cancel, or X to exit."
select FILE in "${MATCHEDFILES[@]}"; do
if [[ -n $FILE ]]; then
readarray -t MATCHEDLINES < <(exec grep -n "$SEARCHITEM" "$FILE")
echo "Please select starting line."
select LINE in "${MATCHEDLINES[@]}"; do
if [[ -n $LINE ]]; then
LINENUM=${LINE%%:*}
tail -n "+$LINENUM" "$FILE" | head -n "$NUMLINES"
elif [[ $REPLY == [cC] ]]; then
break
elif [[ $REPLY == [xX] ]]; then
break 3
fi
done
elif [[ $REPLY == [cC] ]]; then
break
elif [[ $REPLY == [xX] ]]; then
break 2
fi
done
done
#!/bin/bash
shopt -s extglob
SEARCHDIR_DEFAULT="./"
NUMLINES_DEFAULT=10
for (( ;; )); do
until
read -ep "Enter search directory [$SEARCHDIR_DEFAULT]: " SEARCHDIR
[[ $SEARCHDIR =~ ^[[:space:]]*$ ]] && SEARCHDIR=$SEARCHDIR_DEFAULT
[[ -d $SEARCHDIR ]]
do
echo "Please enter a valid directory."
done
SEARCHDIR_DEFAULT=$SEARCHDIR
until
read -p "Enter search item: " SEARCHITEM
[[ ! $SEARCHITEM =~ ^[[:blank:]]*$ ]]
do
echo "Please enter a valid search item."
done
until
read -p "Enter number of lines to display [$NUMLINES_DEFAULT]: " NUMLINES
[[ $NUMLINES =~ ^[[:space:]]*$ ]] && NUMLINES=$NUMLINES_DEFAULT
[[ $NUMLINES =~ ^[[:digit:]]+$ && NUMLINES -gt 0 ]]
do
echo "Please enter a valid number of lines."
done
NUMLINES_DEFAULT=$NUMLINES
readarray -t MATCHEDFILES < <(exec grep -rle "$SEARCHITEM" "$SEARCHDIR")
P1="Please select a file to search into. [ENTER = show list again, C = cancel, X = exit]: "
P2="Please select starting line. [ENTER = show list again, C = cancel, X = exit]: "
PS3=$P1
select FILE in "${MATCHEDFILES[@]}"; do
if [[ -n $FILE ]]; then
readarray -t MATCHEDLINES < <(exec grep -ne "$SEARCHITEM" "$FILE")
if [[ ${#MATCHEDLINES[@]} -eq 0 || ! ${MATCHEDLINES[0]} =~ ^[[:digit:]]+: ]]; then
echo "No matching lines were extracted. Perhaps file is a binary."
elif [[ ${#MATCHEDLINES[@]} -eq 1 ]]; then
LINENUM=${MATCHEDLINES[0]%%:*}
echo "----------------------------------------"
tail -n "+$LINENUM" "$FILE" | head -n "$NUMLINES"
echo "----------------------------------------"
else
PS3=$P2
select LINE in "${MATCHEDLINES[@]}"; do
if [[ -n $LINE ]]; then
LINENUM=${LINE%%:*}
echo "----------------------------------------"
tail -n "+$LINENUM" "$FILE" | head -n "$NUMLINES"
echo "----------------------------------------"
elif [[ $REPLY == [cC] ]]; then
break
elif [[ $REPLY == [xX] ]]; then
break 3
fi
done
PS3=$P1
fi
elif [[ $REPLY == [cC] ]]; then
break
elif [[ $REPLY == [xX] ]]; then
break 2
fi
done
done
# Usage: giveme searchstring [numlines]
find . -type f -exec awk -v n=${2:-10} '
/'"$1"'/ {
printf("==== %s ====\n",FILENAME);
for(i=0;i<n;i++)
{
printf("%4d: %s\n",FNR,$0);
getline
}
}' {} +