Как может я “кошка” файл и удалять прокомментированные строки?

Я думаю Вы, проблема не находится в перенаправлении портов, но другой опции в конфигурации NAT в маршрутизаторе.

Во-первых, удостоверьтесь при использовании IP LAN Вы можете успешно SSH от другой машины в сети. Это гарантирует работы SSH вообще.

Во-вторых, тест от другой машины вне сети с помощью общедоступного IP. Это гарантирует тому перенаправлению портов работы.

В-третьих, протестируйте от той же самой машины вне сети и используйте DynDNS URL. Это гарантирует, что DynDNS работает правильно.

Если все те успешно выполняются, то ничто не неправильно с Вашей конфигурацией (который я приму, корректно), и Вы, проблема только получает доступ к общедоступному IP (или непосредственно или через DynDNS) из сети. Это означает, что Ваш маршрутизатор должен иметь включенное отражение NAT (если возможный) для маршрутизации внутренних запросов, как будто они были внешними запросами на общедоступный IP.

29
07.12.2011, 16:17
12 ответов

Можно использовать:

sed -e '/^;/d' php.ini
32
27.01.2020, 19:38

Вы не должны передавать файл по каналу через grep, grep берет имя (имена) файла в качестве командной строки args.

grep -v '^#' file1 file2 file3

распечатает все строки КРОМЕ тех, которые начинают с # символа. можно изменить символ комментария на то, чего Вы желаете.

Если у Вас есть больше чем один символ комментария (принятие в начале строки)

egrep -v '^(;|#|//)' filelist
25
27.01.2020, 19:38
  • 1
    Другой я сделал это всегда застревающее во мне, был grep '^[^;]' filename. Я не могу говорить с его мобильностью хотя! –  Jodie C 08.12.2012, 15:57
  • 2
    @JodieC, это портативно, но также и удаляет пустые строки (Который часто желаем). Стандартный эквивалент egrep grep -E. Можно также использовать grep -ve '^[;#]' -e '^//' –  Stéphane Chazelas 28.01.2013, 14:30

egrep может сохранить Вас использование cat. Другими словами, создайте меньше процессов (egrep по сравнению с cat+egrep) и использование меньше буферов (передают по каналу от cat кому: egrep по сравнению ни с каким каналом).

Это обычно - хорошая идея ограничить использование cat если Вы просто хотите передать файл команде, которая может считать его самостоятельно.

С этим сказал, следующая команда удалит комментарии, даже если они будут расположены с отступом с пробелами или вкладками:

egrep -v '^[[:blank:]]*;' file.ini
9
27.01.2020, 19:38
  • 1
    Забавный, что Вы комбинируете более новое [[ класс символов ]] формат regex с использованием egrep команда удержана от использования, по крайней мере, в течение десятилетия или около этого. –  mikeserv 13.03.2014, 18:25
  • 2
    Интересный... текущие документы в gnu.org/software/grep/manual/html_node / … включают классы POSIX. –  Jack Wasey 18.08.2017, 15:08
egrep -v '^;|^$' $file

это исключит строки, которые начинаются''; и пустые строки.

в regex, ^ указывает на начало строки, и $ конец строки, таким образом, ^$ указывает строки, где запуск символа строки и конец символа строки друг прямо рядом с другом.

7
27.01.2020, 19:38
  • 1
    поэтому, если я читаю это право, это может удалить прокомментированные строки, но также и пустые строки? –  cwd 07.12.2011, 07:26
  • 2
    @cwd Да. Я не уверен, почему он включал обоих, но если Вы только хотите удалить прокомментированные строки, просто используют egrep -v '^;' –  Michael Mrozek♦ 07.12.2011, 07:44
  • 3
    egrep нравятся файлы также (меньше процессов, и буферизует используемый), и немного премии должно было бы удалить расположенные с отступом комментарии также: egrep -v '^[[:blank:]]*;' file.ini –  nrolans 07.12.2011, 08:55
  • 4
    Нам нужно "бесполезное использование кошки" значок. –  Simon Richter 07.12.2011, 13:02
  • 5
    @nrolans - похож на популярный комментарий, почему бы не сделать это ответом? –  cwd 07.12.2011, 16:13

Простое awk острота awk '/^;/{next}1' input_file должен добиться цели.

[jaypal:~/Temp] cat file
;   - Show all errors, except for notices
;
;error_reporting = E_ALL & ~E_NOTICE
;
;   - Show only errors
;
;error_reporting = E_COMPILE_ERROR|E_ERROR|E_CORE_ERROR
;
;   - Show all errors except for notices
;
error_reporting  =  E_ALL & ~E_NOTICE

[jaypal:~/Temp] awk '/^;/{next}1' file
error_reporting  =  E_ALL & ~E_NOTICE
[jaypal:~/Temp] 
2
27.01.2020, 19:38
  • 1
    Корректный, но подробный. Просто awk '!/^;/' input_file достаточно. –  manatwork 08.12.2011, 11:32

Разработка на ответе @shabunc, это использует Perl, чтобы разделить комментарии (включая встроенные комментарии), затем распечатать любые строки, содержащие что-либо кроме пробела.

$ perl -ne 's/;.*//; print if /\S/' data.txt

Объяснение:

  • s/;.*// использует оператор замены (s/<regex>/<replacement>/) заменять экземпляры точки с запятой и всего после него на строке с пустой строкой.
  • print if /\S/ печатает строку, если она соответствует regexp \S, который является классом символов, соответствующим всем непробельным символам.
2
27.01.2020, 19:38

А также Jaypal, я также по всей вероятности использовал бы awk в этих целях. Это хуже, чтобы упомянуть, что жемчуг иногда довольно удобен в таких целях:

cat data.txt | perl -lne "print unless /^;/"

Perl regexps более мощен по сравнению с одним awk, и иногда Вам, возможно, понадобились бы они.

2
27.01.2020, 19:38
  • 1
    +1 для жемчуга, хотя кошка и-l оба избыточны, таким образом, более простой вызов perl -ne 'print unless /^;/' data.txt –  Simon Whitaker 08.12.2011, 05:59
  • 2
    @Simone Whitaker, да, Вы правы - это - просто привычка записать этому способ, которым я пишу, и это ценность для упоминания этого. –  shabunc 08.12.2011, 06:18
  • 3
    . На самом деле я думаю cat хорошо работает в этих примерах, если Вы считаете это как прокси для более универсального "чем-нибудь генерирующим текст на STDOUT". Каналы Unix являются лучше не бывает, по моему скромному мнению. :) –  Simon Whitaker 08.12.2011, 11:43

Вот тот, который я использую, просто заменяю''; с символом комментария (например, '#' для многих сервисных конфигурационных файлов UNIX):

grep -Ev '^[[:space:]]*;|^$' chan_dahdi.conf.sample | sed 's/;.*$//'

Это избавляется от всех комментариев целой строки (даже если у них есть ведущий пробел), и любые комментарии, что нестроки комментария конца, и кратко удаляют пустые строки из вывода также. Это может быть возможно без конвейера (мой sed-, или awk-fu является по общему признанию не большим), но для меня настолько легко понять (и помнить), я полагал, что отправлю его здесь.

1
27.01.2020, 19:38

Шоу в качестве примера только строки + не показывает новые строки или emtpy строки:

$ egrep -v '^(;|#|//)' /etc/ssh/sshd_config | tr '\n' ' '

 Protocol 2    SyslogFacility AUTHPRIV      PasswordAuthentication yes  ChallengeResponseAuthentication no   GSSAPIAuthentication yes GSSAPICleanupCredentials yes  UsePAM yes  AcceptEnv LANG LC_CTYPE LC_NUMERIC LC_TIME LC_COLLATE LC_MONETARY LC_MESSAGES AcceptEnv LC_PAPER LC_NAME LC_ADDRESS LC_TELEPHONE LC_MEASUREMENT AcceptEnv LC_IDENTIFICATION LC_ALL LANGUAGE AcceptEnv XMODIFIERS  X11Forwarding yes   Subsystem sftp    /usr/libexec/openssh/sftp-server 

ИЛИ

$ egrep -v '^(;|#|//|$)' /etc/ssh/sshd_config    

Protocol 2
SyslogFacility AUTHPRIV
PasswordAuthentication yes
ChallengeResponseAuthentication no
GSSAPIAuthentication yes
GSSAPICleanupCredentials yes
UsePAM yes
AcceptEnv LANG LC_CTYPE LC_NUMERIC LC_TIME LC_COLLATE LC_MONETARY LC_MESSAGES
AcceptEnv LC_PAPER LC_NAME LC_ADDRESS LC_TELEPHONE LC_MEASUREMENT
AcceptEnv LC_IDENTIFICATION LC_ALL LANGUAGE
AcceptEnv XMODIFIERS
X11Forwarding yes
Subsystem   sftp    /usr/libexec/openssh/sftp-server
1
27.01.2020, 19:38
  • 1
    Использование egrep долго удерживается от использования. grep -E команда, которую Вы ищете здесь. строки кода –  mikeserv 13.03.2014, 18:23
egrep -v ^'(#|$)' file.txt

Сносит все комментарии и пустые строки из file.txt

.
0
27.01.2020, 19:38

будет раздеваться также пустые линии

grep -E -v "^\s*($|;)" php.ini
0
27.01.2020, 19:38

вы можете использовать следующую команду для сохранения строк, исключая пустые строки и строки, начинающиеся с # в новом файле

cat <файл для чтения> | egrep -v '^ # | ^ $'> <файл для записи в>

0
27.01.2020, 19:38

Теги

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