bash поиск строки в каждой строке файла

Я пытаюсь выполнить очень простую задачу: используйте bash для поиска строк в файле, и если они существуют, выведите их в другой файл. Это может быть jetlag, но это должно работать:

#!/bin/bash

cnty=CNTRY

for line in $(cat wheatvrice.csv); do
    if [[ $line = *$cnty* ]]
    then
        echo $line >> wr_imp.csv
    fi
done

Я также попробовал это для полноты:

#!/bin/bash

cnty=CNTRY

for line in $(cat wheatvrice.csv); do
    case $line in 
    *"$cnty"*) echo $line >> wr_imp.csv;;
    *) echo "no";;
    esac
done

оба выводят все, независимо от того, содержит ли строка CNTRY или нет, и я копирую/вставляю из, казалось бы, надежных источников, поэтому, по-видимому, есть что-то простое в bash-ness, что мне не хватает?

2 ответов


Не используйте bash, используйте grep.

grep -F "$cnty" wheatvrice.csv >> wr_imp.csv

хотя я бы предложил просто использовать grep тоже, вопрос открыт, почему ваш подход не сработал. Здесь самореферентная модификация вашего второго подхода-с ключевым словом "bash", чтобы соответствовать себе:

#!/bin/bash

cnty=bash    
while read -r line
do
    case $line in 
        *${cnty}*) 
            echo $line " yes" >> bashgrep.log
            ;;
        *)
                echo "no"
                ;;
    esac
done < bashgrep.sh

точки составляет while read -r line ... < FILE. Ваша команда с cat включает разделение строк, поэтому каждое слово обрабатывается в цикле, а не каждая строка.

та же проблема в Примере 1.