Я хочу напечатать всю запись, если она содержит слово и некоторые символы, которые являются необязательными. Автор сценария:

/mount[ein]{0,2}/{
print $0}

К сожалению, это не работает. Без "{" и "}" это работает. Я пытался с "\" перед "{":

/mount[ein]\{0,2\}/{
    print $0}

Другой пример. Для файла:

mountx
mounte
mountee
mounteee

Awk:

awk '/mount[ein]{0,2}$/' file

И результат:

//ничего такого

Система: Debian 7.8 Linux ibm 3.2.0-4-amd64 # 1 SMP Debian 3.2.68-1+deb7u1 x86_64 GNU/Linux

3 ответа3

2

Пример tst.txt:

mountx
mounte
mountee
mounteee

скрипт awk (GNU Awk 3.1.7)

awk --re-interval '/mount[ein]{0,2}$/' tst.txt > tst1.txt

результат

mounte
mountee

человек awk

-W re-interval
--re-interval
          Enable the use of interval expressions in regular expression matching (see Regular Expressions, below).  Interval expressions were not traditionally available in the AWK
          language.  The POSIX standard added them, to make awk and egrep consistent with each other.  However, their use is likely to break old AWK programs, so  gawk  only  pro-
          vides them if they are requested with this option, or when --posix is specified.
0

Не уверен насчет формата команды монтирования, и вопрос указан как вопрос "awk", но в вашем комментарии нет awk.

Это то, что вы ищете?

«напечатать из файла все строки, которые содержат 0» (или любую строку, которую вы ищете)- используйте команду

cat temp.txt | grep 0 | awk '{print $0}'

приведет к

0 9 8 7 6 5 4 3 2

5 4 3 2 1 0 9 8

где temp.txt

1 2 3 4 5 6 7

0 9 8 7 6 5 4 3 2

9 8 7 6 5 4

8 7 6 5 4 3

7 6 5 4 3

6 5 4 3

5 4 3 2 1 0 9 8

4

3

2

0

Ваше регулярное выражение работает как с POSIX-совместимым awk и с GNU awk .

Принимая во внимание тот факт, что символы e , i и n должны присутствовать от нуля до трех раз, но что нет никаких дальнейших ограничений, эту часть можно удалить из шаблона, так как mount сопровождается чем-либо или ничем не соответствует в любом случае. Действие (print $0), являющееся также значением по умолчанию, указывать не нужно.

Ваша команда может быть упрощена до:

awk '/mount/'

Если вы хотите, чтобы диапазон использовался, вам нужно указать что-то после него, вот пример:

$ cat input
foo
mountx
mounte
mountee
mounteee
$ /usr/xpg4/bin/awk '/mount[ein]{0,2}$/' input
mounte
mountee

Это в Solaris, где POSIX awk находится в /usr/xpg4/bin .

То же поведение на Mint 17.1 на основе Debian:

$ awk -V | head -1      
GNU Awk 4.0.1
$ awk '/mount[ein]{1,2}$/' input     
mounte
mountee

Тем не менее, похоже, что mawk , который заявляет о соответствии POSIX, не поддерживает выражение интервала (скобка).

$ mawk -W version
mawk 1.3.3 Nov 1996, Copyright (C) Michael D. Brennan
$ mawk '/mount[ein]{1,2}$/' input
$ 

Это известная ошибка.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .