LinuxForum.Fans
Тема

Выборка из тектового файла

Автор: yars 13 сообщений 3252 просмотров
#269292

Доброго времени!
Нужно вытащить из файла вида

text

drwxr-xr-x 11 root root      4096 2012-08-10 01:32 .
-rw-r--r--  1 root root     10188 2011-04-25 04:36 ./ANNOUNCE.13_37
-rw-r--r--  1 root root     20933 2006-10-02 04:36 ./BOOTING.TXT
-rw-r--r--  1 root root     15529 2012-08-05 15:40 ./CHANGES_AND_HINTS.TXT
-rw-r--r--  1 root root    726680 2012-08-09 22:46 ./CHECKSUMS.md5
-rw-r--r--  1 root root       198 2012-08-09 22:46 ./CHECKSUMS.md5.asc
-rw-r--r--  1 root root     17976 1994-06-10 02:28 ./COPYING
-rw-r--r--  1 root root     35147 2007-06-30 04:21 ./COPYING3
-rw-r--r--  1 root root     19531 2009-08-26 02:07 ./COPYRIGHT.TXT
-rw-r--r--  1 root root       616 2006-10-02 04:37 ./CRYPTO_NOTICE.TXT
-rw-r--r--  1 root root    150279 2012-08-10 01:32 ./ChangeLog.txt
-rw-r--r--  1 root root     33523 2008-12-08 18:12 ./FAQ.TXT
-rw-r--r--  1 root root    965411 2012-08-09 22:46 ./FILELIST.TXT
-rw-r--r--  1 root root      1565 2003-02-26 23:34 ./GPG-KEY
-rw-r--r--  1 root root    612107 2012-08-10 01:35 ./PACKAGES.TXT
-rw-r--r--  1 root root      9368 2011-04-21 23:38 ./README.TXT
-rw-r--r--  1 root root      3629 2012-07-13 16:27 ./README.initrd
-rw-r--r--  1 root root     34068 2011-04-08 15:15 ./README_CRYPT.TXT
-rw-r--r--  1 root root      8978 2011-04-08 15:16 ./README_LVM.TXT
-rw-r--r--  1 root root     17957 2011-03-15 18:32 ./README_RAID.TXT
-rw-r--r--  1 root root      3623 2011-04-25 04:57 ./RELEASE_NOTES
-rw-r--r--  1 root root     13855 2008-12-08 18:13 ./SPEAKUP_DOCS.TXT
-rw-r--r--  1 root root     17294 2008-12-08 18:13 ./SPEAK_INSTALL.TXT
-rw-r--r--  1 root root     58732 2010-05-18 21:47 ./Slackware-HOWTO
-rw-r--r--  1 root root      7017 2012-07-21 21:41 ./UPGRADE.TXT

...

-rw-r--r-- 1 root root 16393 2012-07-06 21:13 ./usb-and-pxe-installers/usbimg2disk.sh

(файл - [url]ftp://mirror.yandex.ru/slackware/slackware-current/FILELIST.TXT[/url]) сведения о размере файла. С уникальными файлами отрабатывает на раз

text
grep -e $name FILELIST.TXT | col | rev | cut -d" " -f4 | rev

Но вот с неуникальными, типа CHECKSUMS.md5 grep честно возвращает все найденные совпадения. и мой скрипт впадает в ступор. Как получить размер файла? Спасибо заранее!
Вот проблемный кусок скрипта:

text

for i in $( cat "$TMP/FILELIST.TXT" | tail +7 | cut -d. -f2- ) ; do
    echo "Checking: $i"
    if [ -e "$OLD$i" ] ; then
        echo $i
        newsize=$( grep -e "$i" "$TMP/FILELIST.TXT" | col | rev | cut -d" " -f4 | rev )
        oldsize=$( grep -e "$i" "$OLD/FILELIST.TXT" | col | rev | cut -d" " -f4 | rev )
        echo "Size of new file: $newsize, size of old file: $oldsize"
    ...
    fi
...
done

Нужно это, чтобы следить за обновлениями в current.

#269294

Следить за изменениями просто: достаточно читать ChangeLog.txt.
Возвращаясь к вопросу: с путём искать не пробовали? Например,

text

$ grep \\./CHECKSUMS.md5$ FILELIST.TXT
-rw-r--r--  1 root root    726680 2012-08-09 22:46 ./CHECKSUMS.md5

даст одну нужную строку, а

text

$ grep \\./CHECKSUMS.md5$ FILELIST.TXT | awk '{print $5}'
726680

искомый размер.

#269296
text
#!/usr/bin/env python
import sys
f = open('FILELIST.TXT', 'r')
for line in  f.readlines():
    if line.find(sys.argv[1])>0:
        print(line.split()[7], line.split()[4])
#269297
"bormant" написал:
Следить за изменениями просто: достаточно читать ChangeLog.txt

Ну, в принципе, да. Но, имхо, этот файл дает информацию в удобном для человека виде, а мне нужно поддерживать актуальность "локального зеркала", ну и покрепче въехать в скриптинг :)

"bormant" написал:
с путём искать не пробовали?

Попробую, спасибо!

"bormant" написал:
двойной rev зачем, cut -d' ' -f5 разве не справляется?

Ну, как-то не очень:

Показать
text
root
root

root root root root root root root root root root root root root root root root root root

root

UPD: А с конца выбрать текст легче...
И да, спасибо

#269298

yars,
поправил, так справляется.

#269299

Я тоже чуть красоты навёл

#269950

"yars" написал:
Ну, в принципе, да. Но, имхо, этот файл дает информацию в удобном для человека виде, а мне нужно поддерживать актуальность "локального зеркала", ну и покрепче въехать в скриптинг
лучше дату проверяйте.
#269954

yars написал:

мне нужно поддерживать актуальность "локального зеркала", ну и покрепче въехать в скриптинг :)
man rsync, достаточно одной команды, возможно в cron-е, тем более, что поддержка и на оф. зеркалах, и на mirror.yandex.ru есть.
Также, есть смысл глянуть mirror-slackware-current.sh от AlienBOB-а.
#269955

Ну, мне кажется целесообразным проверять именно контрольную сумму. Сейчас скрипт работает по такому алгоритму: скачиваем FILELIST.TXT, выбираем из него имена файлов, проверяем: если это каталог, то создаем его, если симлинк, то смотрим, на какой файл указывает, проверяем наличие и контрольную сумму этого файла, если все в порядке, копируем этот файл, иначе скачиваем. Если это файл, то тоже проверяем контрольную сумму, если все в порядке, копируем, иначе качаем. Предполагается, что на диске лежит старая current, из которой мы собираем файлы, не менявшиеся со времени последней проверки. Сам скриптик не бог весть какой сложный, как закончу - выложу. Сейчас времени нет с ним заниматься.

#269956

Про rsync знаю, это все в учебных целях, не более.

#270012
"yars" написал:
Ну, мне кажется целесообразным проверять именно контрольную сумму.

на самом деле, это всё ерунда. Надёжно проверять лишь ЭЦП от Патрега. md5 там лишь для контроля правильности записи CD/DVD и прочего такого (когда вы САМИ записывали диск, и следовательно злоумышленник не мог ничего испортить. А вот разные яндексы могут быть взломаны. Причём ничего не стоит сменить не только файл, но и md5)

#270019

Это понятно. Но это я не столько безопасности ради, сколько 1) для контроля целостности принятого из сети файла, и 2) так узнаю о том, что локальные файлы устарели.

#270176
"yars" написал:
Это понятно. Но это я не столько безопасности ради, сколько 1) для контроля целостности принятого из сети файла, и 2) так узнаю о том, что локальные файлы устарели.

1) для этого надо юзать ЭЦП
2) а для этого - дату.

Т.е. алгоритм такой:
1. читаем список файлов, и отбираем новые.
2. качаем новые.
3. проверяем ЭЦП скаченных файлов.

Войдите или зарегистрируйтесь, чтобы ответить.