linux - Error while comparing in shell -
i trying search pattern(trailer) , if occures more once in file, need filenames displayed
f in *.txt if((tail -n 1 $f | grep '[9][9][9]*' | wc -l) -ge 2); echo " file $f has more 1 trailer" fi done
your crying syntax error -ge
operator [ … ]
or [[ … ]]
conditional construct. doesn't have chance way wrote program. -ge
needs number on both sides, , have on left command. meant have output of command, need command substitution syntax: $(…)
. that's
if [ $(tail -n 1 $f | grep '[9][9][9]*' | wc -l) -ge 2 ];
this syntactically correct never match. tail -n 1 $f
outputs 1 line (unless file empty), grep
sees @ 1 line, wc -l
prints either 0 or 1.
if want search pattern on more 1 line, change tail
invocation. while you're @ it, can change grep … | wc -l
grep -c
; both same thing, count matching lines. example, search in last 42 lines:
if [ $(tail -n 42 -- "$f" | grep -c '[9][9][9]*') -ge 2 ];
if want search 2 matches on last lines, that's different. grep
won't because determines whether each line matches or not, doesn't multiple matches per line. if want multiple non-overlapping matches on last line, repeat pattern, allowing arbitrary text in between. you're testing if pattern present or not, need test return status of grep
, don't need output (hence -q
option).
if tail -n 1 -- "$f" | grep -q '[9][9][9]*.*[9][9][9]*';
i changed tail
invocations add --
in case file name begins -
(otherwise, tail
interpret option) , have double quotes around file name (in case contains whitespace or \[*?
). these habits into. put double quotes around variable substitutions "$foo"
, command substitutions "$(foo)"
unless know substitution result in whitespace-separated list of glob patterns.
Comments
Post a Comment