Предполагая, что имя вашего файла file
, вы можете попробовать следующее:
while read -r line;
do
var="$(echo "$line" | cut -d ',' -f 4)";
if [[ "$var" = "E:" ]]; then echo "$line" | sed s/"$var"/''/g ;
else echo "$line";
fi;
done < file
или:
while read -r line; do var="$(echo "$line" | cut -d ',' -f 4)"; if [[ "$var" = "E:" ]]; then echo "$line" | sed s/"$var"/''/g ; else echo "$line";fi; done < file
Объяснение:
while read -r line;
читает файл построчноvar="$(echo "$line" | cut -d ',' -f 4)";
записывает строку на 4 месте, разделенную ,
в переменную var
if [[ && "$var" = "E: " ]]; then echo "$line" | sed s/"$var"/' '/g ;
if $var
has string exactly E:
тогда sed s/"$var"/''/g ;
заменяет ее на пустую """
else echo "$line";
в противном случае печатает строку как есть Пример output (как ожидалось из вопроса):
file
:
$ cat file
12,324,32342,E:fsdsf,23432,34534,45345,324
13,3224,342,E:werwefsdsf,23432,34534,45345,324
121,3244,33442,E:,23432,34534,45345,324
Выполнение команды:
$ while read -r line; do var="$(echo "$line" | cut -d ',' -f 4)"; if [[ "$var" = "E:" ]]; then echo "$line" |sed s/"$var"/' '/g ; else echo "$line";fi; done < file
12,324,32342,E:fsdsf,23432,34534,45345,324
13,3224,342,E:werwefsdsf,23432,34534,45345,324
121,3244,33442,,23432,34534,45345,324
Вы также можете перенаправить вывод в файл, используя >> file2
или |tee file2
в последней части команды:
while read -r line; do var="$(echo "$line" | cut -d ',' -f 4)"; if [[ "$var" = "E:" ]]; then echo "$line" |sed s/"$var"/' '/g ; else echo "$line";fi; done < file | tee file2
В справочной странице сказано, что вы можете записывать адреса в формате cidr (addr/len ). Пример:
AllowUsers user@192.168.176.0/22
Обратите внимание, что это не будет работать с «несогласованными» адресами (, где биты вне маски не все равны 0, например.192.168.177.0/22
)или сочетанием addr/len и подстановочных знаков (, например.192.168.176.*/22
).
AllowUsers
поддерживает шаблоны с подстановочными знаками и адресами CIDR. Но я не могу заставить их работать одновременно, и шаблоны тоже не сильно помогут, так как доступны подстановочные знаки ?
и *
, но не [789]
.
Итак, проще всего просто автоматически сгенерировать правила:
for i in {177..179}; do echo "AllowUsers user@123.56.$i.*" ; done
В документации об этом не сказано, но несколько строк AllowUsers
работают нормально.
Кроме того, в этом случае вы можете использовать что-то вроде:
AllowUsers user@123.56.176.0/22
DenyUsers user@123.56.176.0/24
или
AllowUsers !user@123.56.176.0/24,user@123.56.176.0/22