Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Windows Batch: Search all files in file, if line contains "apple" or "tomato" echo it

I'm trying to write a simple batch that will loop through every line in a file and if the line contains "apples" or "tomato" then to output that line.

I have this code to find one string and output it but I can't get the second in the same batch. I also want it to echo the lines at it finds them.

@echo OFF

for /f "delims=" %%J in ('findstr /ilc:"apple" "test.txt"') do (
echo %%J
)

It would need to find lines that contain either "apples" or "tomato" I can easily run the code above with the two lines I need but I need the lines to be outputted inter each other.

For example I need:

apple
tomato
tomato
apple
tomato
apple
apple

NOT:

apple
apple
apple

THEN

tomato
tomato
tomato

Thanks in advance.

like image 408
Jsn0605 Avatar asked Oct 11 '12 15:10

Jsn0605


2 Answers

Findstr already does this for you :

@findstr /i "tomato apple" *.txt

Replace *.txt with your wildcard (and tomato apple with the words you want).

If you must change the output, then for comes in handy :

@echo off

for /f %%i in ('findstr /i "tomato apple" *.txt') do @echo I just found a %%i
like image 169
ixe013 Avatar answered Sep 28 '22 09:09

ixe013


I think I understand the problem: Given some line in diflog.txt with content Sumbitting Receipt, you want to extract all such lines if they also contain apple or tomato. In addition, you want to output the apple lines together, followed by the toomato lines.

This is the best I can do without an actual windows computer to test on and you can fine tune it from here, but this may help:

@echo OFF
setlocal enabledelayedexpansion

set apples=
set tomatos=

for /f "delims=" %%l in ('findstr /ilc:"Submitting Receipt" "diflog.txt"') do (

  set line=%%l

  for /f "eol=; tokens=1 delims=" %%s in ('echo !line! ^| findstr /ic:"apple"') do (
    set new_apple=%%s
    set apples=!apples!,!new_apple!
  )

  for /f "eol=; tokens=1 delims=" %%s in ('echo !line! ^| findstr /ic:"tomato"') do (
    set new_tomato=%%s
    set tomatos=!tomatos!,!new_tomato!
  )
)

echo Apples:

for /f "eol=; tokens=1 delims=," %%a in ('echo !apples!') do (
  set line_with_apple=@@a
  echo !line_with_apple!
)

echo Tomatos:

for /f "eol=; tokens=1 delims=," %%t in ('echo !tomatos!') do (
  set line_with_tomato=@@a
  echo !line_with_tomato!
)
like image 25
kikuchiyo Avatar answered Sep 28 '22 07:09

kikuchiyo