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!

Ogłoszenie

Prosimy o pomoc dla małej Julki — przekaż 1% podatku na Fundację Dzieciom „Zdążyć z Pomocą”.
Więcej informacji na dug.net.pl/pomagamy/.

#1 2017-09-21 14:36:17

ZiomaL
Nowy użytkownik
Zarejestrowany: 2017-09-21

[Bash] Skrypt, sort, data, sed

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

 

#2 2017-09-21 15:32:41

arecki
Użytkownik
Zarejestrowany: 2016-03-03

Re: [Bash] Skrypt, sort, data, sed

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

 

#3 2017-09-21 15:45:43

lis6502
Łowca lamerów
Skąd: Stalinogród
Zarejestrowany: 2008-12-04

Re: [Bash] Skrypt, sort, data, sed

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

Kod:

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

Kod:

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

Kod:

 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

Kod:

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'.

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_wiersza

Dość 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
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+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

 

#5 2017-09-22 01:16:04

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 >> data1

Tak 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 >> 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.

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
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

 

#6 2017-09-22 12:01:53

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.

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ą

Kod:

 %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

 

#7 2017-10-08 17:40:35

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

 

Stopka forum

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson
To nie jest tylko forum, to nasza mała ojczyzna ;-)