Помещение всех строк, соответствующих определенному шаблону в конце файла

Вы не можете ... по крайней мере, используя протокол подключения на основе IP. Потому что ваше правило отключает весь входящий IP-трафик, поступающий на шлюз.

BTW, все протоколы, которые я знаю как ssh, vnc, rdp и т. Д., Используют IP.

0
задан 11 January 2018 в 05:59

9 ответов

Вы можете использовать это:

{
    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
1
ответ дан 22 May 2018 в 15:37

Вы можете использовать это:

{ 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
1
ответ дан 17 July 2018 в 23:22

Вы можете использовать это:

{ 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
1
ответ дан 24 July 2018 в 13:53

Вот пара опций, использующих 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
1
ответ дан 22 May 2018 в 15:37
  • 1
    Это также работает, спасибо вам за эти множественные выборы! Лучший – milan 11 January 2018 в 10:05

GNU awk (версия 4.1.0 и новее)

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 не может редактировать файлы на месте и если вы не хотите создавать временные файлы, вы можете вывести вывод 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, чтобы изменить их.

0
ответ дан 22 May 2018 в 15:37
  • 1
    Не разбирайте ls ! Используйте glob и for вместо while: for file in *.txt. Это позволяет избежать проблем с именами файлов, которые содержат специальные символы, такие как символы новой строки. – wjandrea 11 January 2018 в 22:51
  • 2
    @WJAndrea - Структура while имеет свои преимущества, такие как упрощение выполнения дополнительных шагов предварительной обработки перед передачей списка файлов через цикл или при чтении списка входных файлов из другого файла с помощью cat или [F3]. Кроме того, кто-то уже показал, как использовать for. – Gaultheria 12 January 2018 в 00:27

GNU awk (версия 4.1.0 и новее)

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 не может редактировать файлы на месте и если вы не хотите создавать временные файлы, вы можете вывести вывод 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, чтобы изменить их.

0
ответ дан 17 July 2018 в 23:22

Вот пара опций, использующих 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
1
ответ дан 17 July 2018 в 23:22

GNU awk (версия 4.1.0 и новее)

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 не может редактировать файлы на месте и если вы не хотите создавать временные файлы, вы можете вывести вывод 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, чтобы изменить их.

0
ответ дан 24 July 2018 в 13:53
  • 1
    Не разбирайте ls ! Используйте glob и for вместо while: for file in *.txt. Это позволяет избежать проблем с именами файлов, которые содержат специальные символы, такие как символы новой строки. – wjandrea 11 January 2018 в 22:51
  • 2
    @WJAndrea - Структура while имеет свои преимущества, такие как упрощение выполнения дополнительных шагов предварительной обработки перед передачей списка файлов через цикл или при чтении списка входных файлов из другого файла с помощью cat или [F3]. Кроме того, кто-то уже показал, как использовать for. – Gaultheria 12 January 2018 в 00:27

Вот пара опций, использующих 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
1
ответ дан 24 July 2018 в 13:53
  • 1
    Это также работает, спасибо вам за эти множественные выборы! Лучший – milan 11 January 2018 в 10:05

Другие вопросы по тегам:

Похожие вопросы: