[BASH] Skrypt, sort, data, sed

0

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 1831
1 Jan 2017 1328
29 Nov 2016 1711

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 1831
/home/otzi/Mail/msg.UEAQ 31 Jan 2017 1328
/home/otzi/Mail/msg.rBAQ 2 Nov 2016 1711
/home/otzi/Mail/msg.fDAQ 29 Dec 2016 1334
/home/otzi/Mail/msg.6DAQ 1 Jan 2017 1332
/home/otzi/Mail/msg.pAAQ 06 Nov 2016 1249
/home/otzi/Mail/msg.YDAQ 23 Dec 2016 1354
/home/otzi/Mail/msg.gDAQ 29 Dec 2016 1514
/home/otzi/Mail/msg.FGAQ 2 Sep 2017 1349
/home/otzi/Mail/msg.IBAQ 16 Nov 2016 1703
/home/otzi/Mail/msg.zDAQ 06 Jan 2017 1934
/home/otzi/Mail/msg.JFAQ 24 Mar 2017 1752
/home/otzi/Mail/msg.XFAQ 9 Apr 2017 1541
/home/otzi/Mail/msg.FFAQ 21 Mar 2017 0402
/home/otzi/Mail/msg.DGAQ 2 Sep 2017 1309

Dzięki z góry, dopiero zaczynam swoją przygodę ze skryptami.
Pozdrawiam

0
  1. Zamias sed najlepiej użyć grep:

    • godzina: grep -oE '\d\d:\d\d:\d\d'
    • rok: grep -oE '\d\d\d\d' (zakładając, że wszystkie lata mają 4 cyfry
    • miesiąc: \<[A-Z][a-z][a-z]\> (zakładając, że wszystkie miesiące są 3 literowymi skrótami zaczynającymi się od dużej litery)

    Alternatywnie można użyć date (może być wolniejsze, bo musi przeparsować dane) tak: while read line; do LC_ALL=en date -jf '%d %b %Y %H:%M:%S' "$line" +"<format daty jaki chcesz>"; done < "$file"

  2. Najprościej będzie tutaj użyć Rubiego lub innego języka skryptowego.

0

Jest taka fajna komenda:

cut -f4 -d" "

po -f definiujesz numery kolumn ktore chcesz (f4, zwroci 4 element) -f3- to wlasnie wszystko od 3 spacji.
-d to delimiter

Co do sortowania po czasie, nie latwiej zrobic ls -latr ? (latwy mnemonik, z latryna mozna skojarzyc).

BTW. zagraj sobie w Bandita, przejdziesz wszystkie poziomy to bedziesz ogarnial takie rzeczy bez problemu:) http://overthewire.org/wargames/bandit/

0

Jak wyguglujesz "bash change date format in file"
to znajdziesz kilka przykładów korzystających z awk, date i czasami sed.
Sam sed wygląda raczej smutno w tych rozwiązaniach:
https://unix.stackexchange.com/a/311225

1 użytkowników online, w tym zalogowanych: 0, gości: 1