2012-12-20 4 views
1

Я новичок в Unix.awk-скрипты и обратные косые черты

${AWK} '\!/^/&& \!/^-/ && \!/^</ && \!/^$/ {printf "%s,,N,N,N,,,,\n", $1}' ~/ozserver.txt 

Когда я запускаю команду, как и раньше, есть errorInfo печататься в окно Cygwin следующим образом:

awk: commandline:1:^backslash not last character on line 

На самом деле, моя роль перевести csh в bash для обучения. Я не написал этот код. Итак, что я знаю:

"\!/regex/" : is a model unit."\" is belong to the awk synax for cut down the long sentence 
"!"means logical NOT,"/regex/" means one model.btw,"&&" means logical AND. 

Я просто не могу понять, где не так. Может ли кто-нибудь дать мне знак?

+1

вам не нужно скрывать '!' S, просто используйте '!' Вместо '\!' – perreal

+0

да! Вы правы! – fanshaoer

ответ

3

csh 'metasyntactic zoo' означает, что ! является оператором истории даже внутри одиночных кавычек или что-то в этом роде. В SANE^H^H^H^H оболочки, полученные из Bourne оболочки, то ! не такая большая проблема, и вы можете просто написать:

${AWK} '!/^/&& !/^-/ && !/^</ && !/^$/ {printf "%s,,N,N,N,,,,\n", $1}' ~/ozserver.txt 

Конечно, это может быть упрощена еще больше:

${AWK} '!/^[- <]/ && !/^$/ {printf "%s,,N,N,N,,,,\n", $1}' ~/ozserver.txt 

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

${AWK} '/^[^- <]/ {printf "%s,,N,N,N,,,,\n", $1}' ~/ozserver.txt 

Что ищет строку, начинающуюся с символом, отличным от пустого, тира или меньше (но он должен содержать, по крайней мере один символ, так что пустые строки автоматически исключается). И последняя версия может даже нормально работать в csh, так как она вообще не использует !.

+0

: Спасибо за помощь и подробное объяснение! Это так полезно! И веселые хиристы! – fanshaoer