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 Fundacji Dzieciom zdazyć z Pomocą.
Więcej informacji na dug.net.pl/pomagamy/.

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

  ZiomaL - Nowy użytkownik

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

arecki
Użytkownik
Skąd: 44 Bronson Lane Hensonville
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

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ą [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 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[/quote]
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?[/quote]
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[/quote]
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'.[/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_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

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

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

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

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

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

[ Generated in 0.020 seconds, 12 queries executed ]

Informacje debugowania

Time (s) Query
0.00014 SET CHARSET latin2
0.00006 SET NAMES latin2
0.00257 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='3.144.124.232' WHERE u.id=1
0.00181 REPLACE INTO punbb_online (user_id, ident, logged) VALUES(1, '3.144.124.232', 1713543966)
0.00092 SELECT * FROM punbb_online WHERE logged<1713543666
0.00141 DELETE FROM punbb_online WHERE ident='47.128.96.66'
0.00155 SELECT topic_id FROM punbb_posts WHERE id=314361
0.00208 SELECT id FROM punbb_posts WHERE topic_id=29922 ORDER BY posted
0.00181 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.00010 SELECT search_for, replace_with FROM punbb_censoring
0.00214 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.00111 UPDATE punbb_topics SET num_views=num_views+1 WHERE id=29922
Total query time: 0.0157 s