103

I'm trying to produce this behaviour:

grep 192.168.1 *.txt

By passing a string into grep via Xargs but it is going on the end instead of as the first parameter.

echo 192.168.1 | xargs grep  *.txt

I need to tell xargs (or something similar) to put the incoming string between 'grep' and '*' instead of on the end.

How do I do this?

1

2 Answers 2

162
$ echo 192.168.1. | xargs -I{} grep {} *.txt

Example

Sample files:

$ cat {1..3}.txt
192.168.1
192.168.1
192.168.1

Example run:

# example uses {} but you can use whatever, such as -I{} or -Ifoo
$ echo 192.168.1. | xargs -I{} grep {} *.txt
1.txt:192.168.1.
2.txt:192.168.1.
3.txt:192.168.1.
5
  • Thanks, it works. But why? What are you replacing with -I ? I don't get it.
    – e18r
    Dec 21, 2016 at 16:18
  • 14
    It seems the curly brackets are a place holder. You can replace {} with anything you like: echo 192.168.1. | xargs -I pholder grep pholder *.txt Jun 19, 2017 at 0:47
  • 1
    @denormalizer I am not sure why, but using {} as place holder is not working for me, instead, % works for me.
    – zyy
    Mar 2, 2020 at 17:08
  • 1
    @zyy Would be interesting to know what OS you are running. I think I've got it working on Ubuntu and CentOS Mar 2, 2020 at 22:23
  • @denormalizer I think mine is CentOS Linux release 7.7.1908.
    – zyy
    Mar 3, 2020 at 3:21
5

Another approach:

find . -name \*.txt -print0 | xargs -0 grep 192.168.1

This will not overflow the shell's command line length with too many file names. To avoid confusing xargs/grep with file names that have spaces, -print0 and -0 options will delineate each found name with a null rather than a LF.

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .