Wie entferne ich bestimmte Zeilen aus einer Datei?

Wie entferne ich bestimmte Zeilen aus einer Datei?

Ich habe eine Datei ( ip.txt), die IP-Regeln enthält

/sbin/iptables -A INPUT -p tcp -s 140.237.4.252 -j DROP
/sbin/iptables -A INPUT -p tcp -s 143.227.5.22 -j DROP

/sbin/iptables -A INPUT -p udp -s 140.237.4.252 -j DROP
/sbin/iptables -A INPUT -p tcp -s 143.227.5.22 -j DROP

Ich verwende das folgende Bash-Skript ( removeip.sh), um UDP- und TCP-Zeilen, die zu einer bestimmten IP gehören, aus der ip.txtDatei zu entfernen.

function removeip(){
    ip="$1"        
    udprule="/sbin/iptables -A INPUT -p udp -s "$ip" -j DROP"
    tcprule="/sbin/iptables -A INPUT -p tcp -s "$ip" -j DROP"
    sed --in-place /"$udprule"/d /root/ip.txt
    sed --in-place /"$udprule"/d /root/ip.txt     
}

removeip $1

Wenn ich den folgenden Befehl im Terminal verwende

./removeip.sh 140.237.4.252

es wirft

sed: -e expression #1, char 59: unterminated `s' command

Was ist die Ursache dieses Problems und wie kann ich es beheben?

Antwort1

Das /Zeichen ist ein Operator in sed. Im Grunde erhalten Sie:

sed '//sbin/iptables -A INPUT -p tcp -s "{ip}" -j DROP/d' /root/ip.txt

Dies bedeutet, dass Sie versuchen, „//sb“ als Sed-Befehl auszuführen, wobei bsich das Trennzeichen befindet, und kein weiteres „b“ gefunden werden kann.

Sie müssen die Sonderzeichen in Anführungszeichen setzen:

udprule="\/sbin\/iptables -A INPUT -p udp -s "$ip" -j DROP"

Und aus demselben Grund müssen Sie auf den Inhalt von $ip achten.

verwandte Informationen