简体   繁体   中英

Combine two grep commands to process input from a file or grep lines starting with one specific substring and contain another after

I have a file that i want to pars using grep command, the file consist of lines like this:

NVO,0,267,61,247357,247357,O,19:00:00.000000,06:09:08.417320,07:55:22.068670
DVD,0,267,61,247357,247357,O,19:00:00.000000,06:09:08.417320,07:55:22.068670
NVO,0,267,61,247358,247358,B,19:00:00.000000,06:09:08.417407,07:55:22.079291
DVD,0,267,61,247358,247358,B,19:00:00.000000,06:09:08.417407,07:55:22.079291

I want to get only the line that start with NVO, and have,B, in the line. the out put should look like this:

NVO,0,267,61,247358,247358,B,19:00:00.000000,06:09:08.417407,07:55:22.079291

to get the NVO, line I'm using grep ^NVO, file_name.txt but I'm unable to add the second condition ,B, I tried grep '^NVO,|,B,' file_name.txt and also

grep ",B," | grep "^NVO," file_name.txt 

with no luck I know I can do it with two commands, the first to write to file and then to do a second grep command with the ,B, filter

The operation you're attempting does not actually require combining two grep calls. Therefore, you can use

grep "^NVO,.*,B," file > outfile

Details :

  • ^ - string start
  • NVO, - an NVO, string
  • .* - any text (any zero or more chars)
  • ,B, - a ,B, text.

See the online demo :

#!/bin/bash
s='NVO,0,267,61,247357,247357,O,19:00:00.000000,06:09:08.417320,07:55:22.068670
DVD,0,267,61,247357,247357,O,19:00:00.000000,06:09:08.417320,07:55:22.068670
NVO,0,267,61,247358,247358,B,19:00:00.000000,06:09:08.417407,07:55:22.079291
DVD,0,267,61,247358,247358,B,19:00:00.000000,06:09:08.417407,07:55:22.079291'
grep "^NVO,.*,B," <<< "$s"

Output:

NVO,0,267,61,247358,247358,B,19:00:00.000000,06:09:08.417407,07:55:22.079291

Adding this for folks who actually have a good reason to combine two separate grep calls -- the answer by Wiktor is appropriate in your case, where you don't.


The problem here is that your last copy of grep is completely ignoring the input from the first one, because you're passing it a filename to read -- so it reads the file and ignores the prior instance. (Also, you aren't telling the first grep where to get input from, so it's reading from stdin).

You can fix that by passing the filename to the first component of the pipeline:

grep ",B," input_file | grep "^NVO," >output_file

...or passing the input file as stdin:

<input_file grep ',B,' | grep '^NVO,' >output_file

Alternately, if you want to treat both grep s as a unit, and pass their stdin and stdout at the end, you can do that:

{ grep ',B,' | grep '^NVO,'; } <input_file >output_file

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM