Автор Гілка: Питання щодо grep  (Прочитано 4467 раз)

Відсутній noddeat

  • Кореспондент
  • ***
  • дописів: 197
  • Карма: +0/-0
Питання щодо grep
« : 2008-06-14 01:35:49 »
Навіть не знаю, як краще: створити окрему тему по bash, чи спамити різними темами. Отож, питання маю таке:

$cat topsecret.txt | grep secret
Top secret is equal to 42

питання, як далі обробити вивід ґрепу, щоб від нього залишилось лише 42? це частина більшої задачі:

є набір файлів типу topsecret_1.txt, top_secret_4.txt, top_secret_5.txt,... коже з яких містить рядок:
Top secret is equal to y
який треба ґрепнути, отримати значення y, і записати у файл results.txt у форматі
x y
де x — префікс-число у назві topsecret_x.txt.

« Змінено: 2008-06-14 01:36:23 від noddeat »
Filenames are infinite in length, where infinity is set to to 255 characters. Peter Collinson, "The Unix File System"

Praporshic

  • Гість
Re: Питання щодо grep
« Відповідей #1 : 2008-06-14 01:40:07 »
IMHO, це краще робити через Perl або awk. З останнім простіше, бо можна зробити, наприклад, так:
cat textfile | awk '/secret/ {print $6}'
« Змінено: 2008-06-14 01:40:27 від Praporshic »

Відсутній noddeat

  • Кореспондент
  • ***
  • дописів: 197
  • Карма: +0/-0
Re: Питання щодо grep
« Відповідей #2 : 2008-06-14 01:47:04 »
прикольно. а як в awk обмежити кількість рядків виводу до одного? в смислі аналог

grep -m1 secret topsecret.txt

?
Filenames are infinite in length, where infinity is set to to 255 characters. Peter Collinson, "The Unix File System"

Михайло Даниленко

  • Гість
Re: Питання щодо grep
« Відповідей #3 : 2008-06-14 01:55:04 »
Варіанти, які б використав я у порядку спадання вірогідності (задача не дуже чітко визначена, тому вважається, що рядок починається із "Top secret is equal to ", після чого йде цифра)
cat textfile | grep secret | cut -d \  -f 6
cat textfile | sed -ne 's/Top secret is equal to \(.*\)/\1/p'
cat textfile | perl -ne 'print "$1\n" if /secret/'

Михайло Даниленко

  • Гість
Re: Питання щодо grep
« Відповідей #4 : 2008-06-14 01:57:37 »
Упс.
cat textfile | perl -ne 'print "$1\n" if /sd sd (\d+)/'

Михайло Даниленко

  • Гість
Re: Питання щодо grep
« Відповідей #5 : 2008-06-14 01:58:51 »
Упс.
cat textfile | perl -ne 'print "$1\n" if /Тоp secret is equal to (\d+)/'

Praporshic

  • Гість
Re: Питання щодо grep
« Відповідей #6 : 2008-06-14 01:59:08 »
Хм, тут вже доведеться писати на awk щось складніше, ніж наведений приклад....
Хоча варто подивитись ось це: http://web.mit.edu/gnu/doc/html/gawk_7.html
« Змінено: 2008-06-14 02:00:48 від Praporshic »

Михайло Даниленко

  • Гість
Re: Питання щодо grep
« Відповідей #7 : 2008-06-14 02:03:50 »
прикольно. а як в awk обмежити кількість рядків виводу до одного? в смислі аналог
grep -m1 secret topsecret.txt
?
а для цього є tail =)
spoilercat textfile | awk '/secret/ {print $6;exit}'

Михайло Даниленко

  • Гість
Re: Питання щодо grep
« Відповідей #8 : 2008-06-14 02:05:21 »

Praporshic

  • Гість
Re: Питання щодо grep
« Відповідей #9 : 2008-06-14 02:07:29 »
cat textfile | awk '/secret/ {print $6;exit}'
Вік живи - вік навчайся  :)

Відсутній noddeat

  • Кореспондент
  • ***
  • дописів: 197
  • Карма: +0/-0
Re: Питання щодо grep
« Відповідей #10 : 2008-06-14 02:15:29 »
а для цього є tail =)
Упс. :D
head
ні, мені якраз tail треба, тобто останній результат. через ґреп я це робив за допомогою tac topsecret.txt | grep -m1 secret

вийшло отаке:

Варіант 1.
for a in `find -name "topsecret*.txt"`;
do
cat $a | awk '/secret/ {print $6}' | tail -1
done

Варіант 2.
for a in `find -name "topsecret*.txt"`;
do
tac $a | awk '/secret/ {print $6;exit}'
done

Тепер питання:
1. який ключ у find сортує за датою створення (від старих до нових)?
2. як із $a витягти число-префікс у назві файлу topsecret_x.txt ?
« Змінено: 2008-06-14 02:20:30 від noddeat »
Filenames are infinite in length, where infinity is set to to 255 characters. Peter Collinson, "The Unix File System"

Михайло Даниленко

  • Гість
Re: Питання щодо grep
« Відповідей #11 : 2008-06-14 02:52:50 »
find - шукає, а не сортує. я свого часу робив штуку на кшталт цієї:
find -printf '%T@ %p\n' | sort | sed -e 's/[0-9.]\+ //'

sec="${a#topsecret}"
sec="${a%.txt}"

Михайло Даниленко

  • Гість
Re: Питання щодо grep
« Відповідей #12 : 2008-06-14 02:54:44 »
Упс. Це патологія.
...
sec="${sec%.txt}"

Михайло Даниленко

  • Гість
Re: Питання щодо grep
« Відповідей #13 : 2008-06-14 02:56:59 »
Упс. ;)
find видасть файло із повним шляхом, тому
sec="${a##*/topsecret}"
...

Михайло Даниленко

  • Гість
Re: Питання щодо grep
« Відповідей #14 : 2008-06-14 10:40:02 »
Off-topic:
я свого часу робив штуку на кшталт цієї

list ()
{
local l_tmp pack_name="${1:-${USER}}"
        { find -P ${LIST_SCAN_AREA
  • } -xdev \

                -not \( \( \
                        -false $( \
                                for l_tmp in ${LIST_NOSCAN
  • } ; do \

                                        echo -n '-or' '-wholename' ${l_tmp}' ' ; \
                                done \
                        ) \
                        \) -prune \
                \) -and \( \
                        -group "${pack_name}" -or \
                        -user "${pack_name}" \
                \) -and \( \( \
                                -type f -and \( \( \
                                        -false $( \
                                                for l_tmp in ${LIST_DOCDIRS
  • } ; do \

                                                        echo -n '-or' '-wholename' \'${l_tmp}'/*'\'' ' ; \
                                                done \
                                        ) \
                                        \) -printf "350:%p\n" -or \
                                        -wholename '*/lib/*' -printf "250:%p\n" -or \( \
                                                -wholename '*/bin/*' -or \
                                                -wholename '*/sbin/*' \
                                        \) -printf "150:%p\n" \
                                \) \
                        \) -or \
                        -type d -printf "550:%p\n" -or \
                        -type l -printf "650:%p\t->\t%l\n" , \
                        -perm +7022 -and -not -type l -printf "750:%m\t%p\n" , \
                        -printf "850:%p\t%y\t%u\t%g\t%m\t%s\t%k\n" \
                \) ; \
                echo -e "\n100:\n120:[ Виконувані ]" \
"\n200:\n220:[ Бібліотеки ]" \
"\n300:\n320:[ Документація ]" \
"\n500:\n520:[ Шнягозбірки ]" \
"\n600:\n620:[ Посилання ]" \
"\n700:\n720:[ Небезпечні ]" \
"\n800:\n820:[ Вцілому ]" \
"\n821:Назва\tТип\tВласник\tГрупа\tДозволи\tРозмір\tНа диску" ; \
        } | \
        sort -f - | \
        sed -e 's/^[0-9]\+://' - | \
        tee "${OUT_LOG_DIR}/$(date +%y-%m-%d_%H-%M-%S)_СПИС"
        retv
        return
}


:D :D