Я думаю в этом случае, что Вы очень ограничены FAT.
Ваша проблема с исполняемым битом состоит в том вследствие того, что FAT не поддерживает такие полномочия, который является в значительной степени POSIX вещи. Начиная с системной работы UNIX над такими полномочиями файла при монтировании FS, который не поддерживает ее, она будет эмулирована. действительно по умолчанию файловая система VFAT, смонтированная на Linux, будет иметь все файлы, и каталог появляются как 777, но это не означает, что существует фактический исполняемый набор битов на FS.
Один путь с awk
:
awk '{
for(i=1;i<=NF;i++) {
if($i~/^255/) {
netmask[NR]=i>1?netmask[NR]"\t"$i:$i
}
else {
regular[NR]=i>1?regular[NR]"\t"$i:$i
}
}
}
END {
for(i=1;i<=NR;i++) {
if (regular[i]) {
print regular[i] > "file_with_IPs.txt"
}
if (netmask[i]) {
print netmask[i] > "file_with_only_netmask_ips.txt"
}
}
}' file
$ ls
file
$ cat file
10.140.4.11 10.140.4.110
255.255.0.0 255.255.255.0
10.219.39.188 10.219.39.200
10.219.39.189 10.219.39.145
10.140.4.12 10.140.4.120
10.219.39.138 10.219.39.140
10.219.39.139 10.219.39.239
255.0.0.0 255.255.0.0
255.255.255.128 255.255.255.192
$ awk '{
> for(i=1;i<=NF;i++) {
> if($i~/^255/) {
> netmask[NR]=i>1?netmask[NR]"\t"$i:$i
> }
> else {
> regular[NR]=i>1?regular[NR]"\t"$i:$i
> }
> }
> }
> END {
> for(i=1;i<=NR;i++) {
> if (regular[i]) {
> print regular[i] > "file_with_IPs.txt"
> }
> if (netmask[i]) {
> print netmask[i] > "file_with_only_netmask_ips.txt"
> }
> }
> }' file
$ ls
file file_with_IPs.txt file_with_only_netmask_ips.txt
$ cat file_with_IPs.txt
10.140.4.11 10.140.4.110
10.219.39.188 10.219.39.200
10.219.39.189 10.219.39.145
10.140.4.12 10.140.4.120
10.219.39.138 10.219.39.140
10.219.39.139 10.219.39.239
$ cat file_with_only_netmask_ips.txt
255.255.0.0 255.255.255.0
255.0.0.0 255.255.0.0
255.255.255.128 255.255.255.192
"Дюйм/с сетевой маски", Вы, кажется, подразумеваете, что вещи со всеми битами набора группировались слева. Существует только 32 из них от/0 до/32. Вы могли просто перечислить их в grep операторе (или, лучше, в файле Вы передаете grep -f
).
Этот подход утомителен, но легок;
^0\.0\.0\.0$
^128\.0\.0\.0$
^192\.0\.0\.0$
^224\.0\.0\.0$
⋮
Начиная с на самом деле двоичный шаблон, который мы ищем, Вы могли преобразовать его назад в число, затем сделать некоторое битовое жонглирование на нем, чтобы подтвердить, что это соответствует шаблону. Это было бы фактической задачей программирования, тем не менее, не что-то, что Вы бросите вместе с grep.
Хотя можно сделать что-то, соглашаются до н.э. Вот то, как протестировать $ip
:
(
echo 'obase=2';
echo "$ip" | sed -e 's/\([0-9]\+\)\.\([0-9]\+\)\.\([0-9]\+\)\.\([0-9]\+\)/\1*(256^3)+\2*(256^2)+\3*256+\4/'
) bc | grep -q '^1*0*$' && echo yes || echo no
При разрушении его эхо говорит до н.э для вывода в двоичном файле. Затем это sed
строка превращает IP-адрес в выражение, для вычислений его числового значения. 255.255.255.0
становится 255*(256^3)+255*(256^2)+255*256+0
. Так bc
видит:
obase=2
255*(256^3)+255*(256^2)+255*256+0
Это распечатывает 11111111111111111111111100000000
, который затем проверяется для соответствия шаблону ^1*0*$
с grep
.
Если у Вас будет утилита для преобразования IP в число, то это удалит большую часть сложности выше. Все еще, вероятно, будет медленнее, чем grep
со списком шаблонов, все же.
BEGIN
оператор. Проверьте этот – jaypal singh 20.06.2013, 16:33