Используйте perl.
#!/usr/bin/perl
use strict;
use warnings;
my %words_to_find;
open ( my $input, "<", "/tmp/10218.after" );
while ( my $line = <$input> )
{
my ( $word ) = ( $line =~ m/\A(\S+)\s/ );
$words_to_find{$word}++;
}
close ( $input );
open ( my $search, "<", "/tmp/10218.before" );
while ( my $line = <$search> )
{
foreach my $word ( key %words_to_find )
{
if ( $line =~ m/$word/ )
{
print $line;
last;
}
}
}
close ( $search );
Что-то вроде этого должно помочь.
Кажется, это работает. Я не уверен, есть ли более простой способ сделать это:
grep OpenFin LoginExInternal.txt >> LoginExcInternal.txt &&
echo $'\r' >> LoginExcInternal.txt &&
grep Chrome LoginExInternal.txt >> LoginExcInternal.txt &&
echo $'\r' >> LoginExcInternal.txt &&
grep MemoryUnderThreshold.txt memoryInfo:jsHeapSizeLimit:1 >> LoginExcInternal.txt
Вам не нужно использовать cat
с grep
, и вы можете сгруппировать команды, чтобы поместить туда перенаправление только один раз:
{
grep OpenFin < LoginExInternal.txt && echo
grep Chrome < LoginExInternal.txt && echo
grep memoryInfo:jsHeapSizeLimit:1 < MemoryUnderThreshold.txt && echo
} >> LoginExcInternal.txt
Также обратите внимание, что если вы объедините все команды с помощью &&
, то сбой grep остановит выполнение следующих echo
, а также остальных grep
s. Это может быть или не быть тем, что вы хотите. Использование только grep && echo
, как указано выше, приведет к запуску всех grep
в любом случае, но печатать дополнительные новые строки только тогда, когда grep
соответствует чему-то.
Кроме того, я не совсем уверен, как обрабатываются разрывы строк в cygwin, то есть требуется ли явный вывод возврата каретки $'\r'
.