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ą ls -l --full-time xD.
Jeśli nie wchodzi to w grę, to zaproponuję awka
Najproście wyodrębnić np. tylko godzinę
Problem godziny jest prosty- to zawsze ostatnie pole
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
To przedostatnie pole, czyli awkowo
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?
Drugie pole xD
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 Nov
Jak za pomocą sed zapisać coś w stylu: 'Pokaż wszystko od znalezionej 3 spacji do końca wiersza
Pozwól że pozostanę przy awku, który do takich danych w moim odczuciu bardziej się nadaje
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 spacjami
lub pokaż wszystko od znalezionej 3 spacji do 4 spacji'.
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_wiersza
Dość toporne rozwiązania, ale skuteczne. Przyznaj się lepiej co tam rzeźbisz to łatwiej będzie Ci pomóc ;)
Offline
Wymyśliłem jeszcze prostsze rozwiązanie xD
date --date '15 Nov 2016 18:25:31' +%Y"rok "%m"miesiontz "%d"dzien"+%H%M%S 2016rok 11miesiontz 15dzien+182531
awkiem, 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
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ć)
#!/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 >> data1
Tak działa, ale w sumie mam parę pytań jeszcze. Nie mam tu adresów plików, ponieważ jak wklepałem:
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 >> data1
to 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.
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 done
date: 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.
Pozdrawiam
Ostatnio edytowany przez ZiomaL (2017-09-22 01:20:00)
Offline
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.
Zamknąć stringa ze spacjami w cudzysłowy, nie patrzyłeś na moje przykłady :P
date -d "$date" %Y" "%m" "%d" "%H:%M:%S >> data
Tyle tylko że składnią
%Y" "%m" "%d" "%H:%M:%S >> data
znowu masz sytuację w której data nie jest najszczęśliwiej przedstawiona, w sensie sort'o-strawnie.
Offline
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