LINUX.ORG.RU

if grep -q need; then ...
Зачем руками считывать текст, если grep всё равно сам считает его из stdin?

Или я неправильно понял задачу?

AITap ★★★★★
()

if echo …

ну ты понел. можно с башизмом:

if grep -q need <<<«$4check»

anonymous
()
Ответ на: комментарий от AITap

Не, все верно понял. Работает. Но инструмент выбран неверно :(

После grep в stdin почему-то ничего не остается. Т.е. я проверяю stdin на наличие и в зависимости от результата хочу подать весь stdin на вход одной или другой программе. После grep'а там ничего. Что-то я туго сегодня соображаю.

zgen ★★★★★
() автор топика
Ответ на: комментарий от zgen

Тогда придётся читать по одной строке read'ом и дальше разбираться по результату:

n=1;
for ((i=1; i<=сколько_строк_читать; i++)); do
read -r TEXT; echo «$TEXT» | grep -q «need»; ((n*=$?))
done

if [ $n = 0 ]; then нашлось; fi

AITap ★★★★★
()

при более, чем одной строке не работает.

И не должен, он же построчный. А вот, например:

echo -e "1\n2" | awk -v RS='\0' '/1.*2/'
anonymous
()

zgen

на bash проверить multiline stdin на наличие текста

Как?

в wc -l stdin отправь, и результат сохрани. Затем

if [ $N != 0 ] then
  echo "текст есть, $N строчек"
  else echo "текста нет"
fi
drBatty ★★
()
Ответ на: комментарий от AITap

AITap

if grep -q need; then ...
Зачем руками считывать текст, если grep всё равно сам считает его из stdin?

это не тот stdin. Внезапно - он для каждого процесса свой.

drBatty ★★
()
Ответ на: комментарий от drBatty

Тем не менее, если запустить в скрипте grep -q pattern, ему достанется stdin от самого скрипта. Разве нет?

AITap ★★★★★
()
Ответ на: комментарий от drBatty

Или просто head -n сколько_нужно | grep -q pattern :)

AITap ★★★★★
()
Ответ на: комментарий от AITap

AITap

Тем не менее, если запустить в скрипте grep -q pattern, ему достанется stdin от самого скрипта. Разве нет?

хрен его знает. наверное да.

а зачем так делать? это ведь непонятно?

drBatty ★★
()

Все вышеотвеченное к делу не относится, а не работает у тебя не grep, а 4сheck=, с каких пор идентификатор может начинаться с цифры? Да, </dev/stdin не нужно, достаточно `cat -`.

ABW ★★★★★
()
Ответ на: комментарий от ABW

, а 4сheck=

Судя по:

при более, чем одной строке не работает

«need»

Это навскидку написанный пример. Так что, мистер «пришел-все-объяснил» идите дальше.

anonymous
()
Ответ на: комментарий от AITap

while read line
do
let i++
header[$i]=«$line»
if [ «$line» ]; then
<------>if [[ «$line» == *Clear:RC:0* ]];
<------>then
<------> printf «%s\n» «${header[@]}» «`cat -`» | $spamc -U /var/run/spamd/spamd -u $user | $lda -d $user -f $sender
<------> exit
<------>fi
else
<------>printf «%s\n» «${header[@]}» «`cat -`» | $lda -d $user -f $sender
<------>exit
fi
done

Чтобы не пропадало, заодно покритикуете.

zgen ★★★★★
() автор топика
Ответ на: комментарий от drBatty

а зачем так делать?

В один fork() считать stdin и поискать в нём pattern.

это ведь непонятно?

Скорее да, чем нет. Но никто не мешает написать рядом комментарий.

AITap ★★★★★
()
Ответ на: комментарий от aol

aol

а текста-то нет!

4 пустые строки - это тоже текст. Но если строчка одна, то да, следует проверить, пустая она, или нет.

Ладно, вот, проверенный пример (требовалось найти need)

$ echo -e "ned\nneee\nneed" | sed -n '/need/q70'
$ echo $?
70
$ echo -e "ned\nneee\nned" | sed -n '/need/q70'
$ echo $?
0
Видно, что на нескольких строчках тоже работает.

Выдаёт 70, если нашла, и 0 иначе. Можно прямо пихать в if then.

drBatty ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.