Составляем скрипт (разнообразные вопросы по утилитам)

Готовые решения для многих вопросов, которые очень часто задаются снова и снова.

Модератор: Модераторы разделов

Аватара пользователя
Bolverk
Бывший модератор
Сообщения: 1571
ОС: Cygwin
Контактная информация:

Re: Составляем скрипт

Сообщение Bolverk »

по первому вопросу я обычно grep -v использую
Спасибо сказали:
Аватара пользователя
masa
Сообщения: 86
ОС: linux

Re: Составляем скрипт

Сообщение masa »

http://gazette.linux.ru.net/rus/articles/a...ide/a15696.html
маленькая шпаргалка по седу

а удалить строки это приблизительно так
grep --invert-match blablabla file > newfile
в newfile будет все кроме строк с blablabla
Gentoo Base System 1.12.5 (2.6.17-gentoo-r8)
Спасибо сказали:
Аватара пользователя
pzp-5
Сообщения: 558
Статус: Главный модератор "Пингвинария" на Лафоксе.

Re: Составляем скрипт

Сообщение pzp-5 »

laser писал(а):
12.01.2006 19:12
Подскажите, как удалить все строки, содержащие
2 или 3 известные комбинации символов.

что_надо_исключить - имеется ввиду "строка, содержащая ЭТО" не попадет в новый файл.

Код: Выделить всё

cat подопытный_файл | grep -v 'что_надо_исключить' > новый_файл
Угадайте: где на фотографии, которая представляет мой аватавр, спрятана птичка?
Спасибо сказали:
laser
Сообщения: 7

Re: Составляем скрипт

Сообщение laser »

Спасибо, спасибо, спасибо, всем!
Чувствую себя не чайником, а самоваром.:)
Спасибо сказали:
Аватара пользователя
SelF
Сообщения: 83

Re: Составляем скрипт

Сообщение SelF »

Помогите, пожалуйста!
Необходимо найти файл с определённым словом в большом количестве файлов.
посоветуйте команды, чтобы это сделать.
Заранее спасибо.
Спасибо сказали:
ErrOR
Сообщения: 54

Re: Составляем скрипт

Сообщение ErrOR »

SelF писал(а):
16.03.2006 16:13
Помогите, пожалуйста!
Необходимо найти файл с определённым словом в большом количестве файлов.
посоветуйте команды, чтобы это сделать.
Заранее спасибо.




man grep
Спасибо сказали:
Аватара пользователя
sash-kan
Администратор
Сообщения: 13939
Статус: oel ngati kameie
ОС: GNU
Контактная информация:

Re: Составляем скрипт

Сообщение sash-kan »

и подробнее

Код: Выделить всё

find /path/to/find/ | xargs grep word_to_find

а также

Код: Выделить всё

man find; man xargs
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
Спасибо сказали:
Аватара пользователя
madskull
Сообщения: 1019
Статус: Экс-металлюга
Контактная информация:

Re: Составляем скрипт

Сообщение madskull »

зачем такие сложности? grep -r замечательно может рекурсивно искать. И, в отличие от, выводить имена файлов, где найдено.
ArchLinux / IceWM
Спасибо сказали:
dimanb
Сообщения: 2

Re: Составляем скрипт

Сообщение dimanb »

У меня по лабам по линуксу такой вопрос, на который мне не удалось найти ответа :( : вывести список файлов из /usr/share/man , начинающихся с символа 'q' с заходом в подкаталоги. Список отсортировать по размеру файлов в порядке возрастания. Это надо сделать одной командой. Для сортировки подходит ls, но ничего не прирдумать :wacko: ...
Спасибо сказали:
Аватара пользователя
elide
Бывший модератор
Сообщения: 2421
Статус: Übermensch
ОС: лялих

Re: Составляем скрипт

Сообщение elide »

Код: Выделить всё

find /usr/share/man/ -name 'q*' | xargs ls -lrS
так?
слава роботам!
Спасибо сказали:
dimanb
Сообщения: 2

Re: Составляем скрипт

Сообщение dimanb »

elide писал(а):
04.04.2006 21:41

Код: Выделить всё

find /usr/share/man/ -name 'q*' | xargs ls -lrS
так?

А одной командой никак?
И как действует ключ -R (рекурсивно заходить в подкаталоги)? Он вообще действует?
Спасибо сказали:
Аватара пользователя
elide
Бывший модератор
Сообщения: 2421
Статус: Übermensch
ОС: лялих

Re: Составляем скрипт

Сообщение elide »

конечно действует. и заходит. просто тогда ты не сможешь отделить файлы, которые начинаются с q.
слава роботам!
Спасибо сказали:
Каменьщик
Сообщения: 189

Re: Составляем скрипт

Сообщение Каменьщик »

Сразу признаюсь они для /me дремучий лес.
Как в регекспах обзначить символ(ы) перехода на новую строку.
Конкретнее мне это надо в Kate, для поиска-замены. В гуйовом составителе регекспов (kde) такого, что-то нет.
AMD Athlon XP, 1800 MHz (13.5 x 133) 2200+
Gigabyte GA-7VA (VIA VT8377 Apollo KT400; Realtek ALC650 @ VIA AC'97 Enhanced Audio Controller)
NVIDIA Geforce4 MX 440 AGP8X NV18 Chip Rev A2

Да, я именно Каменьщик, ибо нас каменщиков много.
{23.04.06: аккаунт покинут создателем и не используется более}
Спасибо сказали:
Аватара пользователя
Mitya-ncc
Сообщения: 268
Статус: Живущий тут
Контактная информация:

Re: Составляем скрипт

Сообщение Mitya-ncc »

$
пример cat /etc/squid/squid.conf | grep ss$ напечатает строки, оканчивающиеся на ss
В одном мгновеньи – видеть вечность,
Огромный мир в горсти песка,
В одной песчинке – бесконечность,
И небо в чашечке цветка.
Спасибо сказали:
Аватара пользователя
Skull
Модератор
Сообщения: 2089
ОС: ALT Linux
Контактная информация:

Re: Составляем скрипт

Сообщение Skull »

Каменьщик писал(а):
11.04.2006 01:18
Сразу признаюсь они для /me дремучий лес.
Как в регекспах обзначить символ(ы) перехода на новую строку.
Конкретнее мне это надо в Kate, для поиска-замены. В гуйовом составителе регекспов (kde) такого, что-то нет.
Вообще то нужно различать конец строки и символы конца строки. Соотвественно, $ и [\n] (оба есть в конструкторе регулярных выражений Kate). Если вы заменяете $ на текст, то он добавляется в конец строки. Но вот с [\n] немного по другому: он остаётся тем самым $ и не рассматривается как символ потока. Чтобы слить строки:

1. Выделите текст
2. Выберите Сервис-Текстовый фильтр
3. Вбейте tr -d '\n'
4. Нажмите Enter или кнопку OK.
Skull
Спасибо сказали:
Каменьщик
Сообщения: 189

Re: Составляем скрипт

Сообщение Каменьщик »

:(

не может найти строку '\n'

Вот пример.

Код: Выделить всё

first first
first first

first first
first first

first first
first first

надо найти первый "first" каждого блока и заменить к примеру на "second"
т.е. получить

Код: Выделить всё

second first
first first

second first
first first

second first
first first

То есть якорем, ключевой строкой поиска является "пустая строка" после каждого блока.
как это сделать (в Kate) не знаю.
^$ находит эту строку. Но, ^$^first не прокатывает, как и "\nfirst" или "\n first", как уже писал вообще не находит '\n'
AMD Athlon XP, 1800 MHz (13.5 x 133) 2200+
Gigabyte GA-7VA (VIA VT8377 Apollo KT400; Realtek ALC650 @ VIA AC'97 Enhanced Audio Controller)
NVIDIA Geforce4 MX 440 AGP8X NV18 Chip Rev A2

Да, я именно Каменьщик, ибо нас каменщиков много.
{23.04.06: аккаунт покинут создателем и не используется более}
Спасибо сказали:
Аватара пользователя
madskull
Сообщения: 1019
Статус: Экс-металлюга
Контактная информация:

Re: Составляем скрипт

Сообщение madskull »

если прокатит, можно так

Код: Выделить всё

sed -n '/^$/{b s2};${H;:s2 x;s/first/second/;p;b};H'

(написано "сходу", наверняка можно оптимизировать)
ArchLinux / IceWM
Спасибо сказали:
Alex_D
Сообщения: 8

Re: Составляем скрипт

Сообщение Alex_D »

Как изветстно в месяцах различное количество дней
Есть такая задача:
надо скачать телепрограмму на неделю, файл называется tv-02-08.htm
пишу так:

Код: Выделить всё

#!/bin/sh

#weekday now
weekday=`date +%u`
#day now
day=`date +%d`
#first and last day of week
let day_start=day-weekday+1
let day_end=day_start+6

#load tv program file like "tv-02-08.htm"
wget http://address.dom/tv-$day_start\-$day_end\.htm

если конец недели не перескакивает на другой месяц (либо начало недели на предыдущий) все работает.
каким образом можно делать проверку чтобы скрипт работал в люое время?
Спасибо сказали:
Аватара пользователя
Jan2ary
Бывший модератор
Сообщения: 630
Статус: Тщедушный очкарик

Re: Составляем скрипт

Сообщение Jan2ary »

Так date умеет и день недели показывать... Всю дату полностью в каком хочешь формате.

аа, я просто вопрос не понял...
попробуй посмотреть в сторону календарика cal, может он что подскажет...
Не шалю, никого не трогаю, починяю примус...
Спасибо сказали:
Alex_D
Сообщения: 8

Re: Составляем скрипт

Сообщение Alex_D »

Jan2ary писал(а):
21.04.2006 15:40
Так date умеет и день недели показывать... Всю дату полностью в каком хочешь формате.

это все понятно, но если я знаю, что сегодня 27 и вторник - мне надо узнать какое число понедельник и какое воскресенье, для этого мне надо описывать сколько дней вкаждом месяце и т.д.
Есть ли что-то готовое типа 27.02.2006 + 3 дня = 02.03.2006
Спасибо сказали:
Аватара пользователя
Jan2ary
Бывший модератор
Сообщения: 630
Статус: Тщедушный очкарик

Re: Составляем скрипт

Сообщение Jan2ary »

Скорее всего что-то готовое есть, просто я не знаю :)
А я тут подумал, что можно делать вот типа такого

today=date -u +'%d'
cal -m | grep $today

выведет текущую неделю, которую уже можно разбирать по дням - первый и последний елементы и будут граничными числами недели. При переходе через месяц нужно просто посчитать количество дней, которые надо дополнить до недели.
Не шалю, никого не трогаю, починяю примус...
Спасибо сказали:
Аватара пользователя
Гарыныч
Сообщения: 202
ОС: Gentoo

Re: Составляем скрипт

Сообщение Гарыныч »

Хм, если я правильно понял вопрос, то вот простое решение:

Код: Выделить всё

#!/usr/bin/php
<?
    $date = @$_SERVER['argv'][1];
    $inc  = @$_SERVER['argv'][2];
    if(!$date || (!$inc && $inc != '0')) die("Error\n");
    $w1 = '([0-9]{2})';
    $w2 = '([0-9]{4})';
    eregi("^$w1.$w1.$w2$", $date, $pock);
    if(!$pock[1] || !$pock[2] || !$pock[3]) die("Error\n");
    $d = $pock[1];
    $m = $pock[2];
    $y = $pock[3];
    unset($pock);
    $date = mktime(0, 0, 0, $m, $d, $y);
    $date += $inc * 24 * 60 * 60;
    echo date("d-m-Y", $date) . "\n";
?>

Использование:

Код: Выделить всё

$ php script.php 21.04.2006 3
24-04-2006
$ php script.php 21.04.2006 10
01-05-2006
То есть первый параметр - конкретная дата, второй - сколько дней прибавить.
Можно легко доделать, чтобы он выводил имя нужного html файла :)

З.Ы. Я его попроще написал, чтоб понятнее было
Спасибо сказали:
Alex_D
Сообщения: 8

Re: Составляем скрипт

Сообщение Alex_D »

Jan2ary писал(а):
21.04.2006 15:40
попробуй посмотреть в сторону календарика cal, может он что подскажет...

посмотрел
не то

2 Гарыныч
Большое спасибо
заработало
я догадывался, что в php или perl можно такое замутить, но ими не особо владею

доработаю и вставлю в свой скрипт как функцию

еще раз спасибо
Спасибо сказали:
Аватара пользователя
sash-kan
Администратор
Сообщения: 13939
Статус: oel ngati kameie
ОС: GNU
Контактная информация:

Re: Составляем скрипт

Сообщение sash-kan »

(Alex_D @ Apr 21 2006, в 14:42) писал(а):Есть ли что-то готовое типа 27.02.2006 + 3 дня = 02.03.2006

Код: Выделить всё

date -d "2006/02/27 +3 days"
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
Спасибо сказали:
Alex_D
Сообщения: 8

Re: Составляем скрипт

Сообщение Alex_D »

sash-kan писал(а):
21.04.2006 17:07
(Alex_D @ Apr 21 2006, в 14:42) писал(а):Есть ли что-то готовое типа 27.02.2006 + 3 дня = 02.03.2006

Код: Выделить всё

date -d "2006/02/27 +3 days"


<_<
блин, а я уже переписал скрипт
а сейчас заново надо
короче спасибо намного упростится задача
Спасибо сказали:
Аватара пользователя
serzh-z
Бывший модератор
Сообщения: 8259
Статус: Маньяк
ОС: Arch, Fedora, Ubuntu
Контактная информация:

Re: Составляем скрипт

Сообщение serzh-z »

Столкнулся с необходимостью вырезать из файла некий кусок, на основании регулярного выражения. Данный кусок может быть (а может и не быть) многострочным. Не хотелось бы прибегать к помощи чего-то ещё кроме grep или sed (awk нежелателен). Но столкнулся с тем, что не могу заставить упомянутые программы работать со всем потоком сразу, не учитывая концов строк. Пропустить поток через tr, с целью удаления "\r\n" (файл виндовый, всё под Cygwin) перед grep тоже не сильно подходит. Возможно ли такое вообще?
Спасибо сказали:
Аватара пользователя
diesel
Бывший модератор
Сообщения: 5989
ОС: OS X, openSuSE, ROSA, Debian
Контактная информация:

Re: Составляем скрипт

Сообщение diesel »

serzh-z писал(а):
18.05.2006 15:14
Столкнулся с необходимостью вырезать из файла некий кусок, на основании регулярного выражения. Данный кусок может быть (а может и не быть) многострочным. Не хотелось бы прибегать к помощи чего-то ещё кроме grep или sed (awk нежелателен). Но столкнулся с тем, что не могу заставить упомянутые программы работать со всем потоком сразу, не учитывая концов строк. Пропустить поток через tr, с целью удаления "\r\n" (файл виндовый, всё под Cygwin) перед grep тоже не сильно подходит. Возможно ли такое вообще?


Не знаю насколько правильно, для того чтобы искать многострочные элементы grep-ом использю опцию P - использовать регулярные выражения из perl. Типа grep -P "bla-bla-bla\nbla-bla-bla" ))

Про многострочие в sed можно посмотреть тут: http://www.unix.org.ua/orelly/unix/sedawk/ch06_01.htm
Спасибо сказали:
Аватара пользователя
serzh-z
Бывший модератор
Сообщения: 8259
Статус: Маньяк
ОС: Arch, Fedora, Ubuntu
Контактная информация:

Re: Составляем скрипт

Сообщение serzh-z »

Пожалуй, подойдёт. Спасибо.
Спасибо сказали:
Аватара пользователя
nerezus
Сообщения: 525
Статус: Вселенский отказник
ОС: windoze

Re: Составляем скрипт

Сообщение nerezus »

Как убить процессы, имя исполняемого файла которых начинается на sv_. Одной коммандой.

Просто надоело список процессов ps aux |grep sv_
а потом kill -9 пид1 пид2 пид3...

Как это в 1 комманду объединить? =)
ICQ 547097
Спасибо сказали:
Закрыто