Вы не можете ... по крайней мере, используя протокол подключения на основе IP. Потому что ваше правило отключает весь входящий IP-трафик, поступающий на шлюз.
BTW, все протоколы, которые я знаю как ssh, vnc, rdp и т. Д., Используют IP.
Вы можете использовать это:
{
grep -v '^N' file.txt
grep '^N' file.txt
} > file.txt.temp
mv file.txt.temp file.txt
Это работает, сопоставляя все строки, которые не начинаются с «N» (grep -v '^N'), а затем соответствуют всем строкам, начинающимся с «N» ([ f4]), выводящий во временный файл, затем заменяя оригинал временным файлом.
Тогда, если вы хотите использовать его во всех * .txt-файлах в каталоге:
for f in *.txt; do
{
grep -v '^N' "$f"
grep '^N' "$f"
} > "$f".temp
mv "$f".temp "$f"
done
Вы можете использовать это:
{
grep -v '^N' file.txt
grep '^N' file.txt
} > file.txt.temp
mv file.txt.temp file.txt
Это работает, сопоставляя все строки, которые не начинаются с «N» (grep -v '^N'), а затем соответствуют всем строкам, начинающимся с «N» (grep '^N'), выводящий во временный файл, затем заменяя оригинал временным файлом.
Тогда, если вы хотите использовать его во всех * .txt-файлах в каталоге:
for f in *.txt; do
{
grep -v '^N' "$f"
grep '^N' "$f"
} > "$f".temp
mv "$f".temp "$f"
done
Вы можете использовать это:
{
grep -v '^N' file.txt
grep '^N' file.txt
} > file.txt.temp
mv file.txt.temp file.txt
Это работает, сопоставляя все строки, которые не начинаются с «N» (grep -v '^N'), а затем соответствуют всем строкам, начинающимся с «N» (grep '^N'), выводящий во временный файл, затем заменяя оригинал временным файлом.
Тогда, если вы хотите использовать его во всех * .txt-файлах в каталоге:
for f in *.txt; do
{
grep -v '^N' "$f"
grep '^N' "$f"
} > "$f".temp
mv "$f".temp "$f"
done
Вот пара опций, использующих awk
Во-первых, версия KISS - с использованием нескольких временных файлов a и b:
for f in *.txt; do
awk '/^N/ {print > "b"; next} {print > "a"}' "$f"
cat a b > "$f"
done
Просто потому, что. , ,
То, что вы действительно хотите сделать, это сортировать на месте с пользовательским порядком сортировки (строки, начинающиеся с N после всего остального, затем с оригинального порядка), например, в GNU awk:
function mycmp(ia, a, ib, b) {
x = substr(a,1,1) == "N"
y = substr(b,1,1) == "N"
if (x && !y) return 1
else if (!x && y) return -1
else return ia - ib
}
{a[FNR] = $0}
ENDFILE {
for (i in a) print a[i]
}
Новые версии gawk предоставляют внутреннее расширение - заимствование эталонной реализации из 16.7.4. Включение редактирования на месте файла можно объединить в скрипт gawk Nsort.awk. :
#!/usr/bin/gawk -f
@load "inplace"
function mycmp(ia, a, ib, b) {
x = substr(a,1,1) == "N"
y = substr(b,1,1) == "N"
if (x && !y) return 1
else if (!x && y) return -1
else return ia - ib
}
BEGIN {
inplace = 1
INPLACE_SUFFIX = ".bak"
PROCINFO["sorted_in"] = "mycmp"
}
BEGINFILE {
if (_inplace_filename != "")
inplace_end(_inplace_filename, INPLACE_SUFFIX)
if (inplace)
inplace_begin(_inplace_filename = FILENAME, INPLACE_SUFFIX)
else
_inplace_filename = ""
}
{a[FNR] = $0}
ENDFILE {
for (i in a) print a[i]
}
END {
if (_inplace_filename != "")
inplace_end(_inplace_filename, INPLACE_SUFFIX)
}
Сделайте его исполняемым с помощью chmod +x Nsort.awk и запустите его как
./Nsort.awk *.txt
awk -i inplace '/^N/{ printlast = printlast $0 RS ; next } { print $0 } ENDFILE { printf "%s",printlast ; printlast="" }' file1 file2 file3
Используйте -i inplace, чтобы заменить исходный файл на переупорядоченный файл. ВНИМАНИЕ: Это приведет к перезаписыванию файлов, которые установлены только для чтения. Если строка начинается с N, добавьте строку в буфер printlast. В противном случае напечатайте строку. В конце файла напечатайте буфер printlast, затем сбросьте его для следующего файла. Задайте столько входных файлов, сколько хотите (например, a.txt b.txt c.txt или *.txt). Замените -i inplace на -i inplace -v INPLACE_SUFFIX=".bak", чтобы сохранить копию каждого исходного файла. В этом примере имена файлов резервных копий заканчиваются на .bak.
Если ваша версия awk не может редактировать файлы на месте и если вы не хотите создавать временные файлы, вы можете вывести вывод awk через sponge (из пакета moreutils):
ls -1 *.txt | \
while read file
do
chmod +w "${file}"
awk '/^N/{ printlast = printlast $0 RS ; next } { print $0 } ENDFILE { printf "%s",printlast }' "${file}" | \
sponge "${file}"
done
Вам нужно сделать ввод файлы для записи - chmod +w "${file}" - для sponge, чтобы изменить их.
awk -i inplace '/^N/{ printlast = printlast $0 RS ; next } { print $0 } ENDFILE { printf "%s",printlast ; printlast="" }' file1 file2 file3
Используйте -i inplace, чтобы заменить исходный файл на переупорядоченный файл. ВНИМАНИЕ: Это приведет к перезаписыванию файлов, которые установлены только для чтения. Если строка начинается с N, добавьте строку в буфер printlast. В противном случае напечатайте строку. В конце файла напечатайте буфер printlast, затем сбросьте его для следующего файла. Задайте столько входных файлов, сколько хотите (например, a.txt b.txt c.txt или *.txt). Замените -i inplace на -i inplace -v INPLACE_SUFFIX=".bak", чтобы сохранить копию каждого исходного файла. В этом примере имена файлов резервных копий заканчиваются на .bak.
Если ваша версия awk не может редактировать файлы на месте и если вы не хотите создавать временные файлы, вы можете вывести вывод awk через sponge (из пакета moreutils):
ls -1 *.txt | \
while read file
do
chmod +w "${file}"
awk '/^N/{ printlast = printlast $0 RS ; next } { print $0 } ENDFILE { printf "%s",printlast }' "${file}" | \
sponge "${file}"
done
Вам нужно сделать ввод файлы для записи - chmod +w "${file}" - для sponge, чтобы изменить их.
Вот пара опций, использующих awk
Во-первых, версия KISS - с использованием нескольких временных файлов a и b:
for f in *.txt; do
awk '/^N/ {print > "b"; next} {print > "a"}' "$f"
cat a b > "$f"
done
Просто потому, что. , ,
То, что вы действительно хотите сделать, это сортировать на месте с пользовательским порядком сортировки (строки, начинающиеся с N после всего остального, затем с оригинального порядка), например, в GNU awk:
function mycmp(ia, a, ib, b) {
x = substr(a,1,1) == "N"
y = substr(b,1,1) == "N"
if (x && !y) return 1
else if (!x && y) return -1
else return ia - ib
}
{a[FNR] = $0}
ENDFILE {
for (i in a) print a[i]
}
Новые версии gawk предоставляют внутреннее расширение - заимствование эталонной реализации из 16.7.4. Включение редактирования на месте файла можно объединить в скрипт gawk Nsort.awk. :
#!/usr/bin/gawk -f
@load "inplace"
function mycmp(ia, a, ib, b) {
x = substr(a,1,1) == "N"
y = substr(b,1,1) == "N"
if (x && !y) return 1
else if (!x && y) return -1
else return ia - ib
}
BEGIN {
inplace = 1
INPLACE_SUFFIX = ".bak"
PROCINFO["sorted_in"] = "mycmp"
}
BEGINFILE {
if (_inplace_filename != "")
inplace_end(_inplace_filename, INPLACE_SUFFIX)
if (inplace)
inplace_begin(_inplace_filename = FILENAME, INPLACE_SUFFIX)
else
_inplace_filename = ""
}
{a[FNR] = $0}
ENDFILE {
for (i in a) print a[i]
}
END {
if (_inplace_filename != "")
inplace_end(_inplace_filename, INPLACE_SUFFIX)
}
Сделайте его исполняемым с помощью chmod +x Nsort.awk и запустите его как
./Nsort.awk *.txt
awk -i inplace '/^N/{ printlast = printlast $0 RS ; next } { print $0 } ENDFILE { printf "%s",printlast ; printlast="" }' file1 file2 file3
Используйте -i inplace, чтобы заменить исходный файл на переупорядоченный файл. ВНИМАНИЕ: Это приведет к перезаписыванию файлов, которые установлены только для чтения. Если строка начинается с N, добавьте строку в буфер printlast. В противном случае напечатайте строку. В конце файла напечатайте буфер printlast, затем сбросьте его для следующего файла. Задайте столько входных файлов, сколько хотите (например, a.txt b.txt c.txt или *.txt). Замените -i inplace на -i inplace -v INPLACE_SUFFIX=".bak", чтобы сохранить копию каждого исходного файла. В этом примере имена файлов резервных копий заканчиваются на .bak.
Если ваша версия awk не может редактировать файлы на месте и если вы не хотите создавать временные файлы, вы можете вывести вывод awk через sponge (из пакета moreutils):
ls -1 *.txt | \
while read file
do
chmod +w "${file}"
awk '/^N/{ printlast = printlast $0 RS ; next } { print $0 } ENDFILE { printf "%s",printlast }' "${file}" | \
sponge "${file}"
done
Вам нужно сделать ввод файлы для записи - chmod +w "${file}" - для sponge, чтобы изменить их.
Вот пара опций, использующих awk
Во-первых, версия KISS - с использованием нескольких временных файлов a и b:
for f in *.txt; do
awk '/^N/ {print > "b"; next} {print > "a"}' "$f"
cat a b > "$f"
done
Просто потому, что. , ,
То, что вы действительно хотите сделать, это сортировать на месте с пользовательским порядком сортировки (строки, начинающиеся с N после всего остального, затем с оригинального порядка), например, в GNU awk:
function mycmp(ia, a, ib, b) {
x = substr(a,1,1) == "N"
y = substr(b,1,1) == "N"
if (x && !y) return 1
else if (!x && y) return -1
else return ia - ib
}
{a[FNR] = $0}
ENDFILE {
for (i in a) print a[i]
}
Новые версии gawk предоставляют внутреннее расширение - заимствование эталонной реализации из 16.7.4. Включение редактирования на месте файла можно объединить в скрипт gawk Nsort.awk. :
#!/usr/bin/gawk -f
@load "inplace"
function mycmp(ia, a, ib, b) {
x = substr(a,1,1) == "N"
y = substr(b,1,1) == "N"
if (x && !y) return 1
else if (!x && y) return -1
else return ia - ib
}
BEGIN {
inplace = 1
INPLACE_SUFFIX = ".bak"
PROCINFO["sorted_in"] = "mycmp"
}
BEGINFILE {
if (_inplace_filename != "")
inplace_end(_inplace_filename, INPLACE_SUFFIX)
if (inplace)
inplace_begin(_inplace_filename = FILENAME, INPLACE_SUFFIX)
else
_inplace_filename = ""
}
{a[FNR] = $0}
ENDFILE {
for (i in a) print a[i]
}
END {
if (_inplace_filename != "")
inplace_end(_inplace_filename, INPLACE_SUFFIX)
}
Сделайте его исполняемым с помощью chmod +x Nsort.awk и запустите его как
./Nsort.awk *.txt