2016-09-08 13 views
1

Ich schreibe ein Skript, um GID größer als 1000 und GID kleiner oder gleich 1000 zu filtern. Zweck ist es, lokale Gruppen und nicht-lokale Gruppen (Gruppen aus AD) aus filtern eine Datei ..Bash Script: While-Schleife und wenn Statement

Es gibt eine Datei namens groups.out, die Gruppennamen und GIDs enthält. Es könnte in beliebiger Reihenfolge sein. Unten ist die Beispieldatei, die lokale Gruppen, nicht = lokale Gruppen und GIDs enthält.

1098052 
1098051 
domain users 
fuse 
gdm 
haldaemon 

und hier ist die Logik I

Read line by line from the file, 
if the line is a number then check 
     if number greater than or equal to 1000 then check 
      if greater than or equal to 1000, append it to the file 
     else if number less than 1000 then dump it 
     else if erorr occurs append error to file and break the loop and exit 

if the line is a string then check the gid of the string/group 
    if number greater than or equal to 1000 then append to file 
    else if gid less than 1000 then dump it 
    else if error occurs append error to file and break the loop and exit 
want to repeat it in the loop line by line and if anywhere the error occurs loop should break and exit the entire script 

Nach erfolgreicher Ausführung der Schleife sollte es Erfolg drucken oder wenn ein Fehler auftritt angewendet werden soll, sollte es beenden und fügen Fehler in die Datei. Unten ist mein ungekochter Code mit vielen fehlenden Teilen. Viele Fehler sind auch für GT- oder EQ-Fehler vorhanden. so können Sie es

fileA="groups.out" 
value=1000 
re='[a-z]' 
num='[0-9]' 
while IFS= read lineA 
do 
group=$(getent group "$lineA" | awk -F: '{print $3}') 
# ------Don't know how to check if a number or string ----- 
    if [ "$group" -gt "$value" ]; then 
     echo "$lineA" >> ldapgroups.out 2>> error.out 
     elif [ "$group" -lt "$value" ]; then 
     echo "$lineA" >> /dev/null 2>> error.out 

     else 
     echo " FAILED" 
     exit 1 
     fi 
+0

hier ist eine mögliche lösung zu überprüfen, ob nummer oder string in bash http://stackoverflow.com/a/806923/524743 – Samuel

Antwort

1
#/bin/bash 
fileA="groups.out" 
value=1000 
num='^[0-9]+$' 
while IFS= read lineA 
do 
    #check if the line is numbers only 
    if [[ $lineA =~ $num ]];then 
     echo "This is a number" 
     echo $lineA 
     #check if $line is greater than 1000 
     if [[ $lineA -gt $value ]];then 
      #write it to file named numbers.out 
      echo "number is greater than 1000 writing to file" 
      echo $lineA >> numbers.out 
     else 
      echo "less than, Skipping" 
     fi 
    #if its not number, its group names right? so no need to check if with regex 
    else 
     #do what ever u want with group names here ... 
     echo "string" 
     echo $lineA 
    fi 
# This is where you feed the file to the while loop 
done < $fileA 
ignorieren

Hier Version des Skripts korrigiert wird. Es sollte dich in Schwung bringen. chmod +x scriptfile und verwenden Sie bash scriptfile, um es auszuführen oder in Crontab zu planen.

Da Ihre Informationen zum Anpassen von Gruppennamen mit Gids nicht ausreichen, habe ich es im Skript weggelassen, aber Sie sollten es mit bereitgestellten Informationen in anderen Teilen des Skripts beenden können.

0

Das sieht wirklich so aus, als ob Sie zwei separate Skripte wollen. Das Finden von Zahlen in einem bestimmten Bereich ist mit Awk einfach.

awk '!/[^0-9]/ && ($1 >= 1000)' groups.out 

Der reguläre Ausdruck wählt alle numerischen Eingangsleitungen (oder richtiger, sie schließt Linien, die einen nicht-numerischen Zeichen überall in ihnen enthalten) und dem numerischen Vergleich erfordert das erste Feld 1000 oder mehr zu sein. (Die Standardaktion von Awk besteht darin, die gesamte Zeile zu drucken, wenn die Bedingungen in Ihrem Skript erfüllt sind, sodass wir die implizite Aktion {print} weglassen können).

Wenn Sie auch die Zahlen, die kleiner als 1000 sind, in eine separate Datei extrahieren möchten, sollte die Änderung offensichtlich sein.

Für die nicht-numerischen Werte, können wir

grep '[^0-9]' groups.out | 
xargs getent | 
awk -F : '$3 >= 1000 { print $3 }' 

Mehrere der Zweige in Ihrem Pseudo-Code überflüssig erscheinen tun. Es ist nicht klar, in welcher Situation Sie einen Fehler erwarten oder wie die Aktion, die Sie in der Fehlersituation angeben, Ihnen helfen würde, den Fehler zu diagnostizieren oder zu beheben (Schreibzugriff verweigert, Festplatte voll?), Also habe ich keine Energie verbraucht beim Versuch, diese Teile zu implementieren.