>source

grep을 사용하여 파일을 검색하는 간단한 스크립트가 bash에 있습니다.

아래와 같은 일을하고 싶지만 2 개의 임시 파일을 사용하는 것을 좋아하지 않습니다. 더 좋은 방법이 있습니까?

   #! /bin/bash
FILE="text.txt"
rm /tmp/temp*
temp_file1=$(mktemp /tmp/temp1)
temp_file2=$(mktemp /tmp/temp2)
cp $FILE $temp_file1
for string in $@
do
grep -i "$string" $temp_file1 > $temp_file2
mv $temp_file2 $temp_file1
done
cat $temp_file1

감사합니다

  • 답변 # 1

    이것을 시도하십시오 :

    script.sh :

    echo "$@" | sed 's/[[:space:]]/.*/g' | xargs -Ifile grep -E 'file' test.txt`
    
    

    test.txt 의 샘플 내용 :

    This is sample text
    Good instance of Test procedure completed, yes
    
    

    script.sh 실행 중 :

    ./script.sh Good Test yes
    Good instance of Test procedure completed, yes
    
    

  • 답변 # 2

    awk 를 사용했습니다  성능을 향상 시키지는 않지만 더 많은 요구에 부응하기 때문에 (순서에 관계없이 동일한 줄에서 여러 패턴 검색)

    my_script.sh :

    search=${@:2}
    awk -v search="$search" 'BEGIN{nb_patterns=split(search, a)}{p=1;for(i=1;i<=nb_patterns;i++){if(!(tolower($0)~tolower(a[i]))){p=0}}}p' $1
    
    

    test.txt 예 :

    hello world
    world hello
    hello
    world
    enzjlgz
    
    

    사용법 :

    sh test.sh test.txt HeLlo WorLd
    
    

    결과 :

    hello world
    world hello
    
    

  • 답변 # 3

    #! /bin/bash
    gawk -v words="$*" '
        BEGIN { IGNORECASE=1 ; split(words, words_array, " ") } 
        {
            for (word in words_array) 
            {
                if(index($0, words_array[word]) == 0) 
                {
                    next
                }   
            }
            print
        }'  text.txt
    
    
    gawk 와 함께  꽤 간단 할 수 있습니다.

  • 답변 # 4

    빠른 펄 스크립트는 다음과 같습니다.

    #!/usr/bin/env perl
    use warnings;
    use strict;
    use autodie;
    use List::Util qw/all/;
    use Getopt::Long;
    my $file;
    GetOptions("file=s", \$file);
    my @patterns = map { qr/$_/i } @ARGV;
    open my $in, "<", $file;
    while (my $line = <$in>) {
      print $line if all { $line =~ m/$_/ } @patterns;
    }
    
    

    사용법 :

    $ cat test.txt
    hello world abc
    hello def
    world ghi
    enzjlgz
    it's a world of Jello out there
    $ perl findall.pl --file=test.txt '[hj]ello' world
    hello world abc
    it's a world of Jello out there
    
    

  • 이전 C ++에서 랜덤 사용
  • 다음 axios - 반응 네이티브에서 무거운 API 응답을 처리하는 방법은 무엇입니까?