На самом деле это единственный раздел про unix на этом форуме
Модераторы: /dev/random , Модераторы разделов
Babusha
Сообщения: 203
ОС: Убунту
Сообщение
Babusha » 16.06.2010 14:43
Как проверить наличие слова в файле в баше?
И как мне реализовать что бы, если к примеру, строка будет в файле, выполнялось
А если ее не будет, то выполнялось
Я не знаю как это реализовать, гугл не помог. Все что дальше делать я знаю:
Код: Выделить всё
if [ ]; then
echo "Эта строка есть в файле"
else
echo "Этой строки нету в файле"
fi
broom
Бывший модератор
Сообщения: 1629
Статус: мизантроп.ка
ОС: Gentoo
Сообщение
broom » 16.06.2010 14:57
Код: Выделить всё
grep "строка" <имя файла> && echo "Эта строка есть в файле" || echo "Этой строки нет в файле"
или то же самое:
Код: Выделить всё
if grep "строка" <имя файла>; then
echo "Эта строка есть в файле"
else
echo "Этой строки нету в файле"
fi
but in the darkness, behind your smile, you scream... © Dio
Babusha
Сообщения: 203
ОС: Убунту
Сообщение
Babusha » 16.06.2010 15:49
Спасибо большое, все работает!
А еще вопрос,
Код: Выделить всё
if grep "test" ./test; then
# Нужно стереть эту строку
else
echo "Этой строки нету в файле"
fi
Как стереть строку?
broom
Бывший модератор
Сообщения: 1629
Статус: мизантроп.ка
ОС: Gentoo
Сообщение
broom » 16.06.2010 15:49
Ещё можно, чтобы grep лишний раз не выводил найденную строку, передать ему параметр "-q".
but in the darkness, behind your smile, you scream... © Dio
SLEDopit
Модератор
Сообщения: 4823
Статус: фанат консоли (=
ОС: GNU/Debian, RHEL
Сообщение
SLEDopit » 16.06.2010 16:05
Babusha писал(а): ↑ 16.06.2010 15:49
Как стереть строку?
зачем так сложно? if'ы, условия?
можно просто
Код: Выделить всё
sed -i '/ваша строка/d' список_файлов_или_просто_маска_по_име*
если строка встретится, то она удалится, если нет - то никаких изменений не произойдет.
broom писал(а): ↑ 16.06.2010 15:49
Ещё можно, чтобы grep лишний раз не выводил найденную строку, передать ему параметр "-q".
для поиска грепом, имхо, лучше пользоваться -l. тогда получаем на выходе список файлов и делаем с ним что хотим.
UNIX is basically a simple operating system, but you have to be a genius to understand the simplicity. © Dennis Ritchie
The more you believe you don't do mistakes, the more bugs are in your code.
Babusha
Сообщения: 203
ОС: Убунту
Сообщение
Babusha » 16.06.2010 16:07
зачем так сложно? if'ы, условия?
Нет, мне нужно именно с If.
Можете показать, как сделать именно с if ?
broom
Бывший модератор
Сообщения: 1629
Статус: мизантроп.ка
ОС: Gentoo
Сообщение
broom » 16.06.2010 16:09
Всё равно то же самое.
Код: Выделить всё
if grep "test" ./test; then
sed -i '/ваша строка/d' ./test
echo "Теперь этой строки в файле нет"
else
echo "Этой строки нету в файле"
fi
but in the darkness, behind your smile, you scream... © Dio
SLEDopit
Модератор
Сообщения: 4823
Статус: фанат консоли (=
ОС: GNU/Debian, RHEL
Сообщение
SLEDopit » 16.06.2010 16:11
Babusha писал(а): ↑ 16.06.2010 16:07
Нет, мне нужно именно с If.
дз что ли? (:
Babusha писал(а): ↑ 16.06.2010 16:07
Можете показать, как сделать именно с if ?
Код: Выделить всё
grep -q string file && sed -i '/string/d' file || echo No such string
что равносильно
Код: Выделить всё
if grep -q string file
then
sed -i '/string/d' file
else
echo No such string
fi
зы опоздал (:
UNIX is basically a simple operating system, but you have to be a genius to understand the simplicity. © Dennis Ritchie
The more you believe you don't do mistakes, the more bugs are in your code.
Babusha
Сообщения: 203
ОС: Убунту
Сообщение
Babusha » 16.06.2010 16:18
Всем спасибо огромное!
Все работает
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE
Сообщение
t.t » 16.06.2010 18:04
SLEDopit писал(а): ↑ 16.06.2010 16:05
broom писал(а): ↑ 16.06.2010 15:49
Ещё можно, чтобы grep лишний раз не выводил найденную строку, передать ему параметр "-q".
для поиска грепом, имхо, лучше пользоваться -l. тогда получаем на выходе список файлов и делаем с ним что хотим.
Ну, -q и -l это просто разые случаи применения. Конечно, вместо for i in *; do grep -q text $i && do_someth $i; done удобнее grep -l text * | xargs do_someth. А для единичного действия удобнее -q.
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current
Сообщение
drBatty » 16.06.2010 18:21
а вот пример полностью на sed (а что мелочиться?)
Код: Выделить всё
#!/bin/sed -rf
/bash/{
s/.*/строка '&' стёрта/w /dev/stderr
h
d
}
${
x
/^$/s/.*/в файле не было такого слова/w /dev/stderr
x
}
t.t писал(а): ↑ 16.06.2010 18:04
Ну, -q и -l это просто разые случаи применения. Конечно, вместо for i in *; do grep -q text $i && do_someth $i; done удобнее grep -l text * | xargs do_someth. А для единичного действия удобнее -q.
...а если вы всё равно используете sed, то можно заменить обе команды, и grep -l, и grep -q
например grep -q "XYZ"
это будет