bash - Grep N times from pipe using xargs -
i have file named input contains list of wikipedia or substring of wikipedia titles. want print out lines wikipedia titles, not substring.
i have file named wikititle contains list of wikipedia titles. want grep each line input , if matches ^{string}$, want print out line.
i came below command:
cat input | xargs -0 -i{} bash -c 'grep -q -w ^{}$ wikititle && { echo {}; }' but gives me error of:
xargs: command long how make happen? thanks!
the right way print out lines found in both of 2 files comm:
comm -12 <(sort input) <(sort wikititle) this vastly more efficient trying do: runs single pass, , needs store little content in memory @ time (sort can have larger memory requirements, gnu implementation supports using disk-backed temporary storage).
another more efficient approach following:
grep -f -x -f input wikititle ...this run grep only once, using (newline-separated) strings given in input, against contents of wikititle.
using grep -f avoids treating arguments regexes, strings foo [bar] match when anchored (with wouldn't grep treated [bar] character class). using -x requires full-line matches (thank you, @tripleee!).
...and, if really wanted use xargs , whole bunch of separate grep calls , shell-level echo no reason...
<input xargs bash -c \ 'for line; grep -q -f -x -e "$line" wikititle && printf '%s\n' "$line"; done' _ note doesn't use -i '{}', option makes xargs far less efficient (forcing run command once every single match), , introduces potential security bugs when used bash -c (if line in input file contains $(rm -rf ~), don't want execute it). instead, uses for loop in bash iterate on filenames passed arguments.
Comments
Post a Comment