115 lines
2.4 KiB
Awk
115 lines
2.4 KiB
Awk
# egrep.awk --- simulate egrep in awk
|
|
#
|
|
# Arnold Robbins, arnold@skeeve.com, Public Domain
|
|
# May 1993
|
|
# Revised September 2020
|
|
|
|
# Options:
|
|
# -c count of lines
|
|
# -e argument is pattern
|
|
# -i ignore case
|
|
# -l print filenames only
|
|
# -n add line number to output
|
|
# -q quiet - use exit value
|
|
# -s silent - don't print errors
|
|
# -v invert test, success if no match
|
|
# -x the entire line must match
|
|
#
|
|
# Requires getopt library function
|
|
# Uses IGNORECASE, BEGINFILE and ENDFILE
|
|
# Invoke using gawk -f egrep.awk -- options ...
|
|
|
|
BEGIN {
|
|
while ((c = getopt(ARGC, ARGV, "ce:ilnqsvx")) != -1) {
|
|
if (c == "c")
|
|
count_only++
|
|
else if (c == "e")
|
|
pattern = Optarg
|
|
else if (c == "i")
|
|
IGNORECASE = 1
|
|
else if (c == "l")
|
|
filenames_only++
|
|
else if (c == "n")
|
|
line_numbers++
|
|
else if (c == "q")
|
|
no_print++
|
|
else if (c == "s")
|
|
no_errors++
|
|
else if (c == "v")
|
|
invert++
|
|
else if (c == "x")
|
|
full_line++
|
|
else
|
|
usage()
|
|
}
|
|
if (pattern == "")
|
|
pattern = ARGV[Optind++]
|
|
|
|
if (pattern == "")
|
|
usage()
|
|
|
|
for (i = 1; i < Optind; i++)
|
|
ARGV[i] = ""
|
|
|
|
if (Optind >= ARGC) {
|
|
ARGV[1] = "-"
|
|
ARGC = 2
|
|
} else if (ARGC - Optind > 1)
|
|
do_filenames++
|
|
}
|
|
BEGINFILE {
|
|
fcount = 0
|
|
if (ERRNO && no_errors)
|
|
nextfile
|
|
}
|
|
ENDFILE {
|
|
if (! no_print && count_only) {
|
|
if (do_filenames)
|
|
print file ":" fcount
|
|
else
|
|
print fcount
|
|
}
|
|
|
|
total += fcount
|
|
}
|
|
{
|
|
matches = match($0, pattern)
|
|
if (matches && full_line && (RSTART != 1 || RLENGTH != length()))
|
|
matches = 0
|
|
|
|
if (invert)
|
|
matches = ! matches
|
|
|
|
fcount += matches # 1 or 0
|
|
|
|
if (! matches)
|
|
next
|
|
|
|
if (! count_only) {
|
|
if (no_print)
|
|
nextfile
|
|
|
|
if (filenames_only) {
|
|
print FILENAME
|
|
nextfile
|
|
}
|
|
|
|
if (do_filenames)
|
|
if (line_numbers)
|
|
print FILENAME ":" FNR ":" $0
|
|
else
|
|
print FILENAME ":" $0
|
|
else
|
|
print
|
|
}
|
|
}
|
|
END {
|
|
exit (total == 0)
|
|
}
|
|
function usage()
|
|
{
|
|
print("Usage:\tegrep [-cilnqsvx] [-e pat] [files ...]") > "/dev/stderr"
|
|
print("\tegrep [-cilnqsvx] pat [files ...]") > "/dev/stderr"
|
|
exit 1
|
|
}
|