scripts awk et barres obliques inverses

Je suis nouveau chez Unix.

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

Lorsque je lance la commande comme avant, il y a errorInfo imprimé dans la fenêtre Cygwin comme suit:

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

En fait, mon rôle est de traduire csh en bash pour l’apprentissage. Je n’ai pas écrit ce code. Donc, ce que je sais, c’est:

 "\!/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. 

Je ne peux tout simplement pas comprendre où est le problème. Quelqu’un peut-il me donner un signe?

Le zoo metasyntactique csh veut dire ça ! est un opérateur historique, même à l’intérieur de guillemets simples, ou quelque chose comme ça. Dans des coquilles sensuelles dérivées de Bourne Shell, le ! n’est pas un gros problème, et vous pouvez simplement écrire:

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

Bien sûr, cela peut encore être simplifié:

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

Cela cherche le début de ligne suivi de quelque chose d'autre que blanc, tiret ou moins que (ce n'est pas une ligne vide). Cela aussi peut être simplifié en utilisant une classe de caractères négative:

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

Cela recherche une ligne commençant par un caractère autre que blanc, tiret ou inférieur à (mais il doit contenir au moins un caractère, donc les lignes vides sont automatiquement exclues). Et la dernière version pourrait même fonctionner correctement dans csh car elle n'en utilise pas ! du tout.