问题
NOTE: I am a noob at bash scripts and the awk command - please excuse any dumb mistakes I make.
I am unable to substitute shell variables into my awk pattern. I am trying to scan through a file, find the first occurence of a specific string in the file, and print each line that succeed it in order until it hits an empty string/line.
I don't know the string I am searching for in advance, and I would like to substitute in that variable.
When I run this with the string directly specified (e.g "< main>:"), it works perfectly. I've already searched on how awk patterns work, and how to substitute in variables. I've tried using the -v flag for awk, directly using the shell variable - nothing works.
funcName="<${2}>:"
awk=`awk -v FN="$funcName" '/FN/,/^$/' "$ofile"`
rfile=search.txt
echo -e "$awk" > "$rfile"
The error is just that nothing prints. I want to print all the lines between my desired string and the next empty line.
回答1:
Could you please try following, haven't tested it because no clear samples but should work.
funcName="<${2}>:"
awk_result=$(awk -v FN="$funcName" 'index($0,FN){found=1} found; /^$/{found=""}' "$ofile")
rfile=search.txt
echo -e "$awk_result" > "$rfile"
Things fixed in OP's attempt:
- NEVER keep same name of a variable as a binary's name or on a keyword's name so changed
awk
variable name toawk_result
. - Use of backticks is depreciated now, so always wrap your variable for having values in
var=$(......your commands....)
fixed it forawk_result
variable. - Now let us talk about
awk
code fix, I have usedindex
method which checks if value of variableFN
is present in a line then make a FLAG(a variable TRUE) and make it false till line is empty as per OP's ask.
来源:https://stackoverflow.com/questions/58600762/substituting-shell-variables-into-awk-pattern-looking-scanning-through-file