Reputation: 62224
I want to embed an awk script inside a shell script but I have trouble to do so as I don't know where to end a statement with a ; and where not.
Here's my script
#!/bin/sh
awk='
BEGIN {FS = ",?+" }
# removes all backspaces preceded by any char except _
function format() {
gsub("[^_]\b", "")
}
function getOptions() {
getline
format()
print
}
{
format()
if ($0 ~ /^SYNOPSIS$/ {
getOptions()
next
}
if ($0 /^[ \t]+--?[A-Za-z0-9]+/) {
print $0
}
}
END { print "\n" }'
path='/usr/share/man/man1'
list=$(ls $path)
for item in $list
do
echo "Command: $item"
zcat $path$item | nroff -man | awk "$awk"
done > opts
I'm using nawk by the way.
Thanks in advance
Upvotes: 2
Views: 722
Reputation: 360485
These three lines:
path='/usr/share/man/man1'
list=$(ls $path)
for item in $list
Need to be changed into:
path='/usr/share/man/man1'
for item in $path/*
in case there are spaces in filenames and since ls
is not intended to be used in this way.
Upvotes: 3
Reputation: 16470
There are several things wrong, as far as I can see:
$awk
. You need a single quote on the line after END { ... }
$awk
anywhere. Perhaps you meant on the invocation of awk inside the do
loop.awk
is usually fairly forgiving about semicolons, but any problems in that regard don't have anything to do with using it inside a shell script.Upvotes: 5
Reputation: 342819
i am not really sure what you meant, but if i understand you correctly, your showOpts.awk is that awk code at the beginning of your script, so you could do this
path='/usr/share/man/man1'
list=$(ls $path)
for item in $list
do
echo "Command: $item"
zcat $path$item | nroff -man | nawk ' BEGIN {FS = ",?+" }
# removes all backspaces preceded by any char except _
function format() {
gsub("[^_]\b", "")
}
function getOptions() {
getline
format()
print
}
{
format()
if ($0 ~ /^SYNOPSIS$/ {
getOptions()
next
}
if ($0 /^[ \t]+--?[A-Za-z0-9]+/) {
print $0
}
}
END { print "\n" } '
done >> opts
and you should probably use >> instead of > .
Upvotes: 1