Nie jesteś zalogowany.
Jeśli nie posiadasz konta, zarejestruj je już teraz! Pozwoli Ci ono w pełni korzystać z naszego serwisu. Spamerom dziękujemy!
Prosimy o pomoc dla małej Julki — przekaż 1% podatku na Fundacji Dzieciom zdazyć z Pomocą.
Więcej informacji na dug.net.pl/pomagamy/.
Witam
W sumie to mam konkretnie dwa główne pytania i pomniejsze, pierwsze to:
Jak za pomocą seda w takich liniach: (string, nie pliki)
15 Nov 2016 18:25:31
1 Jan 2017 13:29:28
29 Nov 2016 17:10:11
Najproście wyodrębnić np. tylko godzinę, tylko rok, tylko miesiąc? Ilość znaków się zmienia ze względu na dni, czyli użycie 'kropek' jako 'losowego' znaku odpada.
Jak za pomocą sed zapisać coś w stylu: 'Pokaż wszystko od znalezionej 3 spacji do końca wiersza lub pokaż wszystko od znalezionej 3 spacji do 4 spacji'.
To było pierwsze główne pytanie. Teraz drugie.
Jak najprościej można posortować poniższą listę, żeby na koniec zostały zmienione nazwy plików np. na msg.1 jako najstarszy, a msg.101 jako najnowszy.
/home/otzi/Mail/msg.HBAQ 15 Nov 2016 18:25:31
/home/otzi/Mail/msg.UEAQ 31 Jan 2017 13:29:28
/home/otzi/Mail/msg.rBAQ 2 Nov 2016 17:10:11
/home/otzi/Mail/msg.fDAQ 29 Dec 2016 13:28:34
/home/otzi/Mail/msg.6DAQ 1 Jan 2017 13:15:32
/home/otzi/Mail/msg.pAAQ 06 Nov 2016 12:04:49
/home/otzi/Mail/msg.YDAQ 23 Dec 2016 13:13:54
/home/otzi/Mail/msg.gDAQ 29 Dec 2016 15:32:14
/home/otzi/Mail/msg.FGAQ 2 Sep 2017 13:54:49
/home/otzi/Mail/msg.IBAQ 16 Nov 2016 17:24:03
/home/otzi/Mail/msg.zDAQ 06 Jan 2017 19:30:34
/home/otzi/Mail/msg.JFAQ 24 Mar 2017 17:22:52
/home/otzi/Mail/msg.XFAQ 9 Apr 2017 15:59:41
/home/otzi/Mail/msg.FFAQ 21 Mar 2017 04:40:02
/home/otzi/Mail/msg.DGAQ 2 Sep 2017 13:32:09
Dzięki z góry, dopiero zaczynam swoją przygodę ze skryptami.
Pozdrawiam
Offline
1. Zamiast sed proponowałbym użyć awk.
2. Tu chyba wystarczy pętela z ls
Ostatnio edytowany przez arecki (2017-09-21 15:33:50)
Offline
Najprościej to chyba stworzyć nową listę za pomocą [tt]ls -l --full-time[/tt] xD.
Jeśli nie wchodzi to w grę, to zaproponuję awka
Najproście wyodrębnić np. tylko godzinę[/quote]
Problem godziny jest prosty- to zawsze ostatnie poleKod:
awk 'BEGIN { FS=" ";printf "\n\nWynik\n\n" } {print $NF }' <<< '15 Nov 2016 18:25:31 1 Jan 2017 13:29:28 29 Nov 2016 17:10:11 ' Wynik 18:25:31 13:29:28 17:10:11, tylko rok[/quote]
To przedostatnie pole, czyli awkowoKod:
awk 'BEGIN { FS=" ";printf "\n\nWynik\n\n" } {print $(NF-1) }' <<< '15 Nov 2016 18:25:31 1 Jan 2017 13:29:28 29 Nov 2016 17:10:11 ' Wynik 2016 2017 2016, tylko miesiąc?[/quote]
Drugie pole xDKod:
root@aurora:/home/lis6502# awk 'BEGIN { FS=" ";printf "\n\nWynik\n\n" } {print $2 }' <<< '15 Nov 2016 18:25:31 1 Jan 2017 13:29:28 29 Nov 2016 17:10:11 ' Wynik Nov Jan NovJak za pomocą sed zapisać coś w stylu: 'Pokaż wszystko od znalezionej 3 spacji do końca wiersza[/quote]
Pozwól że pozostanę przy awku, który do takich danych w moim odczuciu bardziej się nadajeKod:
awk '{for (i=3; i<=NF;i++) printf $i" " } END { printf "\n"}' <<< 'pierwsza_spacja druga_spacja trzecia_spacja reszta_wiersza dalsza reszta wiersza ze spacjami' trzecia_spacja reszta_wiersza dalsza reszta wiersza ze spacjamilub pokaż wszystko od znalezionej 3 spacji do 4 spacji'.[/quote]
Kod:
awk '{for (i=3; i<=4;i++) printf $i" " } END { printf "\n"}' <<< 'pierwsza_spacja druga_spacja trzecia_spacja reszta_wiersza dalsza reszta wiersza ze spacjami' trzecia_spacja reszta_wierszaDość toporne rozwiązania, ale skuteczne. Przyznaj się lepiej co tam rzeźbisz to łatwiej będzie Ci pomóc ;)
Offline
#4 2017-09-21 17:58:13
lis6502 - Łowca lamerów
- lis6502
- Łowca lamerów
- Skąd: Stalinogród
- Zarejestrowany: 2008-12-04
Re: [Bash] Skrypt, sort, data, sed
Wymyśliłem jeszcze prostsze rozwiązanie xD
Kod:
date --date '15 Nov 2016 18:25:31' +%Y"rok "%m"miesiontz "%d"dzien"+%H%M%S 2016rok 11miesiontz 15dzien+182531awkiem, cutem czy czym tam se chcesz wyrzynasz nazwę pliku i resztkami karmisz date- wynik wrzucasz do nowego pliku, obok niego nazwę pliku i puszczasz do sorta.
Ostatnio edytowany przez lis6502 (2017-09-21 17:58:55)
Offline
#5 2017-09-22 01:16:04
ZiomaL - Nowy użytkownik
- ZiomaL
- Nowy użytkownik
- Zarejestrowany: 2017-09-21
Re: [Bash] Skrypt, sort, data, sed
Jesteś dla mnie mistrzem :D Ja tu to rozbijam na kolumny, jakieś cudawianki wymyślam, a domyślałem się, że można to jakoś skrócić...
Ale.. (dopiero zaczynam to ogarniać)Kod:
#!/bin/bash int=`find /home/otzi/Mail -iname '*msg.*'| wc -l` for ((i=1; $i <=int; i++)); do plik=`find /home/otzi/Mail -iname '*msg.*' -print | sed -n $i'p'` date=`grep -rh 'Date: ' $plik| sed -e 's/Date: //g'| sed -e 's/^.... //g'| sed -e 's/+.*$//g' | sed -e 's/-.*$//g'` echo "$date" >> data done date -f data +%Y" "%m" "%d" "%H:%M:%S | sort -n >> data1Tak działa, ale w sumie mam parę pytań jeszcze. Nie mam tu adresów plików, ponieważ jak wklepałem:
Kod:
for ((i=1; $i <=int; i++)); do plik=`find /home/otzi/Mail -iname '*msg.*' -print | sed -n $i'p'` date=`grep -rh 'Date: ' $plik| sed -e 's/Date: //g'| sed -e 's/^.... //g'| sed -e 's/+.*$//g' | sed -e 's/-.*$//g'` echo "$date $plik" >> data done date -f data +%Y" "%m" "%d" "%H:%M:%S | sort -n >> data1to wywalało
date: invalid date ‘15 Nov 2016 18:25:31 /home/otzi/Mail/msg.HBAQ
date: invalid date ‘31 Jan 2017 13:29:28 /home/otzi/Mail/msg.UEAQ’
Jak dodam bez adresów, to i tak będę musiał się bawić w szukanie daty po plikach? Pewnie można ograniczyć to jakoś w tej komendzie.
Kolejna sprawa to jak chciałem zrobić, żeby od razu dopisywało mi do pliku zmienioną datę w środku pętli (bez sortowania jeszcze) to wyskakiwał mi taki błąd.Kod:
for ((i=1; $i <=int; i++)); do plik=`find /home/otzi/Mail -iname '*msg.*' -print | sed -n $i'p'` date=`grep -rh 'Date: ' $plik| sed -e 's/Date: //g'| sed -e 's/^.... //g'| sed -e 's/+.*$//g' | sed -e 's/-.*$//g'` echo "$date $plik" >> data date -d $date %Y" "%m" "%d" "%H:%M:%S >> data donedate: extra operand ‘2016’
Try 'date --help' for more information.
date: extra operand ‘2017’
Try 'date --help' for more information.
Jak w 'date -d ' użyć stringa jako zmiennej? Pewnie banalne pytanie.
Dzięki za odpowiedzi.
PozdrawiamOstatnio edytowany przez ZiomaL (2017-09-22 01:20:00)
Offline
#6 2017-09-22 12:01:53
lis6502 - Łowca lamerów
- lis6502
- Łowca lamerów
- Skąd: Stalinogród
- Zarejestrowany: 2008-12-04
Re: [Bash] Skrypt, sort, data, sed
Zacznę od końca, a potem jak będzie chwila to się rozpiszę.
Jak w 'date -d ' użyć stringa jako zmiennej? Pewnie banalne pytanie.[/quote]
Zamknąć stringa ze spacjami w cudzysłowy, nie patrzyłeś na moje przykłady :Pdate -d [color=blue]"[/color]$date[color=blue]"[/color] %Y" "%m" "%d" "%H:%M:%S >> data[/quote]
Tyle tylko że składniąKod:
%Y" "%m" "%d" "%H:%M:%S >> dataznowu masz sytuację w której data nie jest najszczęśliwiej przedstawiona, w sensie sort'o-strawnie.
Offline
#7 2017-10-08 17:40:35
ZiomaL - Nowy użytkownik
- ZiomaL
- Nowy użytkownik
- Zarejestrowany: 2017-09-21
Re: [Bash] Skrypt, sort, data, sed
Bry, w sumie po małej przerwie usiadłem znowu, ogólnie rozbudowałem trochę skrypt i działa tak jak chcę, ale! staram się pozbyć niepotrzebnych linii, a mianowicie nie chcę, aby skrypt tworzył pliki, tak więc mam parę pytań (później wrzucę wszystko, ale na razie nie ma to sensu)
Mam dwie tabele, jedna to $table
2015 01 27 13:49:23
2014 03 22 15:08:47
2013 08 01 12:10:40
2012 10 19 10:03:32
2014 12 11 23:07:09
2013 05 14 14:26:22
2014 12 11 23:07:29
2013 07 28 12:53:55
2014 08 03 21:54:03
2014 04 07 23:36:57
Druga to posortowana ($sorted) właśnie wyżej tabela.
2012 10 19 10:03:32
2013 05 14 14:26:22
2013 07 28 12:53:55
2013 08 01 12:10:40
2014 03 22 15:08:47
2014 04 07 23:36:57
2014 08 03 21:54:03
2014 12 11 23:07:09
2014 12 11 23:07:29
2015 01 27 13:49:23
Chodzi mi o znalezienie numeru linii daty z $sorted w $table.
Czyli czytam wartość ${sorted[1]}, jest to'2012 10 19 10:03:32' i jak w TABELI (nie w pliku) w $table znaleźć numer lini pod którym zapisana jest ta data? (w tym przypadku numer linii to 4)
Kolejne pytanie. Mam taki kod:
for ((i=1; $i <=int; i++)); do
files[i]=`find -iname "*$HOSTNAME*" | sed -n $i'p'`
done
No i w sumie pięknie działa, przypisuje mi do files każdą kolejną pozycję, ale moje pytanie brzmi: "JAK przypisać 'find -iname "*$HOSTNAME*" -print' od razu do tabeli bez pętli, da się tak? Ponieważ bez sensu, żeby co pętle wywoływał tę komendę, skoro wartość może być zapisana w tabeli od razu.
Kolejna sprawa.
Wiem, że mogę wykorzystać coś takiego jak 'set'.
tablica=`find -iname "*$HOSTNAME*" -print`
set — $tablica
echo $1 $3
i wyświetli mi kolejno 1 i 3 pozycję, ale jak mogę wykorzystać to w innej funkcji? Np.
grep -rh 'Date: .*00' $1 Nie zadziała. Muszę przypisać kolejne wartości do zmiennych? (np. nr1=$1) Czy jest jakiś kolejny prosty myk?
Aaaa... Mam jeszcze coś takiego:
....|sed -e 's/"=?utf-8?q?/ /g'|sed -e 's/?="//g'|sed -e 's/=?UTF-8?Q?//g'.....
Czy jest jakaś opcja, zeby sed, bądź grep, nie zwracał uwagi na wielkość znaków? Bez sensu dodawać kolejne wariacje.
Dzięki z góry za poświęcony czas,
Pozdrawiam :)Offline
Informacje debugowania
Time (s) Query 0.00012 SET CHARSET latin2 0.00004 SET NAMES latin2 0.00135 SELECT u.*, g.*, o.logged FROM punbb_users AS u INNER JOIN punbb_groups AS g ON u.group_id=g.g_id LEFT JOIN punbb_online AS o ON o.ident='18.219.47.239' WHERE u.id=1 0.00091 REPLACE INTO punbb_online (user_id, ident, logged) VALUES(1, '18.219.47.239', 1732189674) 0.00041 SELECT * FROM punbb_online WHERE logged<1732189374 0.00084 SELECT topic_id FROM punbb_posts WHERE id=314364 0.00127 SELECT id FROM punbb_posts WHERE topic_id=29922 ORDER BY posted 0.00126 SELECT t.subject, t.closed, t.num_replies, t.sticky, f.id AS forum_id, f.forum_name, f.moderators, fp.post_replies, 0 FROM punbb_topics AS t INNER JOIN punbb_forums AS f ON f.id=t.forum_id LEFT JOIN punbb_forum_perms AS fp ON (fp.forum_id=f.id AND fp.group_id=3) WHERE (fp.read_forum IS NULL OR fp.read_forum=1) AND t.id=29922 AND t.moved_to IS NULL 0.00012 SELECT search_for, replace_with FROM punbb_censoring 0.00135 SELECT u.email, u.title, u.url, u.location, u.use_avatar, u.signature, u.email_setting, u.num_posts, u.registered, u.admin_note, p.id, p.poster AS username, p.poster_id, p.poster_ip, p.poster_email, p.message, p.hide_smilies, p.posted, p.edited, p.edited_by, g.g_id, g.g_user_title, o.user_id AS is_online FROM punbb_posts AS p INNER JOIN punbb_users AS u ON u.id=p.poster_id INNER JOIN punbb_groups AS g ON g.g_id=u.group_id LEFT JOIN punbb_online AS o ON (o.user_id=u.id AND o.user_id!=1 AND o.idle=0) WHERE p.topic_id=29922 ORDER BY p.id LIMIT 0,25 0.00119 UPDATE punbb_topics SET num_views=num_views+1 WHERE id=29922 Total query time: 0.00886 s