Δημοσιεύτηκε: 05 Ιουν 2014, 17:18
από Ilias95
Αν λοιπόν κατάλαβα καλά, πάντα θα τρέχει ένα εκ των TRAPEZI Π/Κ, DOMATIO Π/Κ, NTOYLAPI Π/Κ και εσύ απλά θες να βρίσκεις ποιο απ' αυτά τρέχει και να τρέχεις το «αντίθετο» του. Σωστά; Αν ναι, πολύ το κουράζεις με το sed.

Κώδικας: Επιλογή όλων
#!/bin/bash

line=`ps -A | egrep "(DOMATIO|NTOULAPI|TRAPEZI)"`
if (($? == 0)); then # if egrep matched
prefix=`echo "$line" | sed -r 's/^.*(DOMATIO|NTOULAPI|TRAPEZI).*$/\1/'`
if echo "$line" | rev | cut -d' ' -f1 | grep Κ >/dev/null; then #ΚΑΤΩ running, greek K
suffix="ΠΑΝΩ"
else
suffix="ΚΑΤΩ"
fi
echo "$prefix"
echo "$suffix"
echo "$prefix $suffix"
#./"$prefix $suffix" #execute reverse script
fi

Πάμε να το δούμε λοιπόν σιγά, σιγά.
Αρχικά προσπαθώ να κάνω match μία γραμμή που περιέχει μέσα την λέξη DOMATIO ή τη λέξη NTOULAPI ή τη λέξη TRAPEZI. Αν βρεθεί τέτοια γραμμή (το $? περιέχει τον κωδικό εξόδου της τελευταίας εντολής και αν αυτός είναι 0 σημαίνει ότι είχαμε match) τότε κρατάω με τον sed την λέξη DOMATIO ή NTOULAPI ή TRAPEZI. Το regex που χρησιμοποιώ λέει, βρες την αρχή γραμμής, μετά οσουσδήποτε ότι να 'ναι χαρακτήρες μετά μια απ' τις λέξεις που θέλουμε, ξανά οσουσδήποτε ότι να 'ναι χαρακτήρες και μετά το τέλος γραμμής. Όλο αυτό αντικατέστησε το με τη λέξη που θέλαμε. Το \1 είναι back referencing και αντιστοιχεί σε αυτό που κάναμε match και ήταν μέσα σε παρενθέσεις.

Πρόσεξε ότι χρησιμοποιώ την egrep γιατί θέλω τα extended regex. Το ίδιο μπορώ να πετύχω και με grep -e. Το -r στον sed λέει επίσης να χρησιμοποιηθούν extended regex.

Ωραία, τώρα έχουμε το μέρος του σπιτιού και μένει να βρούμε αν τρέχει το ΠΑΝΩ ή το ΚΑΤΩ για να τρέξουμε το άλλο.
Αρχικά αντιστρέφω την γραμμή με την rev. Πχ:
Κώδικας: Επιλογή όλων
ilias@archpc ~ ➜ echo "25128 ? 00:00:00 ΔΟΜΑΤΙΟ ΚΑ?" | rev
?ΑΚ ΟΙΤΑΜΟΔ 00:00:00 ? 82152

Μετά με την cut παίρνω την πρώτη στήλη:
Κώδικας: Επιλογή όλων
ilias@archpc ~ ➜ echo "25128 ? 00:00:00 ΔΟΜΑΤΙΟ ΚΑ?" | rev | cut -d' ' -f1
?ΑΚ

Το -d ορίζει τον delimeter (διαχωριστικός χαρακτήρας) των στηλών που θέλω να είναι το κενό και το -f1 επιστρέφει την πρώτη στήλη.

Μετά απλά ελέγχω αν το Κ περιέχεται σ' αυτό που έμεινε. Αν ναι τότε θέλουμε να τρέξουμε το ΠΑΝΩ, αλλιώς το αντίθετο. Μάλιστα ελέγχω μόνο το Κ και όχι τίποτα περισσότερο επειδή το script δεν εμφανίζεται πάντα ίδιο στην ps -A. Πχ. ενώ εσένα στο δείχνει DOMATIO ΚΑ? εμένα μου το δείχνει σαν DOMATIO ΚΑΤ?

Τέλος αρκεί να το τρέξω με ./"$prefix $suffix". Όπως βλέπεις αν το βάλεις μέσα σε εισαγωγικά δεν χρειάζεται τις ανάποδες κάθετους που έλεγες.

Hope it helps! :)