Expect: Wprowadzenie

Poniższy kod pozwala na połączenie ssh, automatyczne podanie użytkownika i hasła, wykonanie prostej komendy, przejście do katalogu /tmp i oddaje władzę w ręce w użytkownika skryptu. Taka mała wprawka do programowania w tcl/expect…

#!/usr/bin/expect

## usage if no options
if {[llength $argv] != 3} {
        puts "usage: ssh_login   "
        exit 1
}

# setup variables
set timeout 20
set ip [lindex $argv 0]
set user [lindex $argv 1]
set password [lindex $argv 2]

# call ssh command
spawn ssh "$user\@$ip"

# give password
expect "password:"
send "$password\r";

# give commands when you see "]#" mean all welcome messages are showed
expect "]#"
send "touch ~/I_was_HERE2.txt\r"
send "cd /tmp\r"

# give control to user
interact

Sed: usuwanie „inline” linii z pliku

Problem:
W pewnym pliku logów miałem stare wpisy i chciałem szybko usunąć. Wzorzeć był znany ale zabawa z tymczasowymi plikami i grepem raczej nie wchodziła w grę (nie chciałem zgubić logów właśnie zapisywanych).
Wpisy do usunięcia miały postać (chodziło o datę):

2013-08-08 11:39:17 temp:21.25

Rozwiązanie:
Sed z opcją -i pozwala zmieniać pliki w locie (inline):

sed -i  "/2013-08-08/d" temperature_all.txt

Sed: zmiana w plikach z wykorzystaniem zapamiętywania wzorców (inline):

Problem:
Piszę sobie hobbystycznie małą aplikację to zarządzania domowymi urządzeniami. Jednym z nich jest Arduino z podczepionymi czujnikami temperatury i natężenia światła. Dane z czujników są zapisywane na karcie SD. Na początku format daty ustaliłem sobie dość dowolnie i wyglądał on tak:

10/07/13-20:03:23 photo:49

Jednak w trakcie pisania aplikacji doszedłem do wniosku iż potrzebuję nastepujący format daty:

2013-10-07 19:53:58 photo:399

Rozwiązanie:
Rozwiązaniem okazała się jednolinijkowa komenda sed-a:


sed -i -r 's/([0-9]+)\/([0-9]+)\/([0-9]+)\-/20\3-\1-\2 /' photo_all_*.txt

Opcja -i powoduje nadpisanie pliku, -r włącza wyrażenia regularne.