Filtro Algunos Apache Conf para extraer todos los nombres de servidor y serveralias, luego los emiten uno por línea -- bash campo con sed camp codereview Relacionados El problema

Filter some Apache Conf to extract all ServerName and ServerAlias, then output them one per line


3
vote

problema

Español
  16'hffff8  

El script se debe usar principalmente para recopilar todas las URL de una configuración httpd remota y emitirlas una URL por línea, como

  16'hffff9  

NB: El script real contiene un tipo

  '7890  

... pero eso es Otra pregunta que pedí en StackOverFlow , porque me gustaría extraerlo a otra pieza de software.

¿Qué puedo hacer para mejorar mi guión?

  • De un punto de visión de legibilidad?

  • De un punto de vista de rendimiento?

Original en ingles
#!/bin/bash #extractApacheResolutionName  GrepAndFilter="ServerName|ServerAlias" RemoveBadMatch="s/^\s*($GrepAndFilter)\s+//gI" RemoveTrailingWhitespaces="s/\s*$//" RemoveComas="s/,//g" ReplaceSpacesWithNewLines="s/ +/\s/g"  grep --line-buffered -Ei "$GrepAndFilter" /dev/stdin \     | sed -E "$RemoveBadMatch; $RemoveTrailingWhitespaces; $RemoveComas; $ReplaceSpacesWithNewLines" 

The script is to be used mainly to gather all the URLs of a remote Httpd Configuration, and output them one URL per line, such as

ssh hostname "cat /etc/httpd/conf.d/*.conf" | extractApacheResolutionName 

Nb : the actual script contains a sort

... | rev | sort -u | rev 

... but that's another question I asked on StackOverflow, because I would like to extract it to another piece of software.

What can I do to improve my script ?

  • from a readability point of view ?

  • from a performance point of view ?

     
 
 

Lista de respuestas

1
 
vote
vote
La mejor respuesta
 
  • Esto no usa nada en /bin/bash que no está disponible en /bin/sh , así que prefiera usar la cubierta más simple y portátil.
  • No todos sed Las implementaciones permiten múltiples comandos de punto de semicolón en un argumento; Si desea que sea portátil, especifique cada uno por separado:

      sed -E -e "$RemoveBadMatch" -e "$RemoveTrailingWhitespaces" ...   
  • No es necesario ejecutar un 9988776665544337 Podemos usar el patrón como una dirección para los comandos en nuestro sed script .

  • La tubería de comando final puede ser exec 'ed para ahorrar en la creación de nuevos procesos.

Simplemente escribiría esto como un programa 99887766655443310 ; No hay necesidad de una cáscara:


  Enter the total of your bill (must be greater than 0): .03 Enter the number people that are splitting the bill (must be greater than 0): 7 With the tip percentage of 10.00%, each person pays 0.00 from a $0.03 bill. 1  

Obviamente, no invocar una cáscara mejorará el rendimiento.

 
  • This doesn't use anything in /bin/bash that's not available in /bin/sh, so prefer to use the simpler and more portable shell.
  • Not all sed implementations allow multiple semicolon-separate commands in one argument; if you want to be portable, specify each separately:

    sed -E -e "$RemoveBadMatch" -e "$RemoveTrailingWhitespaces" ... 
  • No need to run a separate grep - we can use the pattern as an address for the commands in our sed script.

  • Final command pipeline can be exec'ed to save on creating new processes.

I'd just write this as a sed program; no need for a shell:


#!/bin/sed -Ef  # remove lines that don't start with ServerName or ServerAlias /^\s*Server(Name|Alias)\s+/!d  # remove the prefix s///  # remove commas and trailing whitespace s/,//g s/\s+$//  # split words into separate lines s/ +/\n/g 

Obviously, not invoking a shell will improve performance.

 
 
 
 
2
 
vote

¿Qué es "Bad Match" aquí?

  Enter the total of your bill (must be greater than 0): .03 Enter the number people that are splitting the bill (must be greater than 0): 7 With the tip percentage of 10.00%, each person pays 0.00 from a $0.03 bill. 2  

Mi comprensión es que este patrón se usa para eliminar el prefijo 99887766555443313 con cualquier espacio en blanco circundante. No veo que el prefijo como "mal coincidencia" en cualquier sentido de la palabra. Parece Enter the total of your bill (must be greater than 0): .03 Enter the number people that are splitting the bill (must be greater than 0): 7 With the tip percentage of 10.00%, each person pays 0.00 from a $0.03 bill. 4 sería un mejor ajuste.


aquí, en lugar de Enter the total of your bill (must be greater than 0): .03 Enter the number people that are splitting the bill (must be greater than 0): 7 With the tip percentage of 10.00%, each person pays 0.00 from a $0.03 bill. 5 como el patrón, usaría Enter the total of your bill (must be greater than 0): .03 Enter the number people that are splitting the bill (must be greater than 0): 7 With the tip percentage of 10.00%, each person pays 0.00 from a $0.03 bill. 6 , Para enfatizar que el contenido se modificará solo cuando hay espacios en blanco y sin cero.

  Enter the total of your bill (must be greater than 0): .03 Enter the number people that are splitting the bill (must be greater than 0): 7 With the tip percentage of 10.00%, each person pays 0.00 from a $0.03 bill. 7  

Aquí, el patrón no coincide con el nombre:

  Enter the total of your bill (must be greater than 0): .03 Enter the number people that are splitting the bill (must be greater than 0): 7 With the tip percentage of 10.00%, each person pays 0.00 from a $0.03 bill. 8  

creo que quiso decir Enter the total of your bill (must be greater than 0): .03 Enter the number people that are splitting the bill (must be greater than 0): 7 With the tip percentage of 10.00%, each person pays 0.00 from a $0.03 bill. 9 como reemplazo, Debido a que one0 no tiene un significado especial en una cadena de reemplazo, Así que como está escrito, Este comando reemplazará los espacios con la letra one1 .


one2 Asume one3 Como entrada de forma predeterminada, no es necesario especificarlo explícitamente.


En muchos sistemas, los archivos de configuración de Apache a menudo contienen one4 y one5 en las líneas comentadas. El guión publicado no funcionará con tales líneas, Y puedo imaginar fácilmente las líneas en los sistemas de producción también. Sugiero que el guión sea más robusto excluyendo las líneas comentadas. Esto podría ser tan simple como hacer que el primer filtro sea más estricto:

  one6  
 

What is "bad match" in here?

RemoveBadMatch="s/^\s*($GrepAndFilter)\s+//gI" 

My understanding is that this pattern is used to remove the $GrepAndFilter prefix from lines, with any surrounding whitespace. I don't see that prefix as "bad match" in any sense of the word. It seems RemoveFilterPrefix would be a better fit.


Here, instead of \s*$ as the pattern, I'd use \s+$, to emphasize that the content will be modified only when there are non-zero trailing whitespaces.

RemoveTrailingWhitespaces="s/\s*$//" 

Here, the pattern doesn't match the name:

ReplaceSpacesWithNewLines="s/ +/\s/g" 

I think you meant \n as the replacement, because \s doesn't have a special meaning in a replacement string, so as written, this command will replace spaces with the letter s.


grep assumes /dev/stdin as input by default, no need to specify it explicitly.


In many systems, the Apache configuration files often contain ServerName and ServerAlias on commented out lines. The posted script won't work with such lines, and I can easily imagine such lines in production systems too. I suggest to make the script more robust by excluding commented lines. This could be as simple as making the first filter more strict:

GrepAndFilter="^\s*(ServerName|ServerAlias)\s+" 
 
 

Relacionados problema

4  Retire cada línea que incluya y siga la segunda ocurrencia de un patrón dado  ( Remove every line that include and follows the second occurrence of a given patt ) 
De un archivo, estoy tratando de eliminar cada línea que incluya y siga la segunda ocurrencia de un patrón dado en Bash (Mac OSX). Tenga en cuenta que un arch...

4  Usando la expresión regular de SED para extraer el nombre de dominio del archivo  ( Using sed regular expression to extract domain name from file ) 
Estoy aprendiendo regex con sed Para extraer el último campo del archivo llamado "Prueba". El método que estoy intentando da la salida deseada. Por favor, s...

3  Acelerar el conjunto de comandos SED en archivos (recursivamente en el directorio completo)  ( Accelerate set of sed commands in files recursively over full directory ) 
ejecuto esto para solucionar algunas referencias codificadas por duros, reemplazando las ocurrencias de Folder.py3 por Folder.py4 : Folder.py5 Sin em...

2  Añadiendo un cero a los nombres de archivos  ( Adding a zero to file names ) 
He descubierto recientemente el poder del SED; Las expresiones regulares parecen que se llevarán toda la vida para dominar. Este pequeño script utiliza ambos ...

4  Transponer una matriz usando sed  ( Transpose a matrix using sed ) 
Estoy tratando de transponer los siguientes datos de: template <class T> using Container = std::vector< std::shared_ptr<T> >; template <class T> Container...

3  Habilitar o deshabilitar secciones de un modelo de acuerdo con la entrada del usuario  ( Enable or disable sections of a model according to user input ) 
Estoy usando el comando SED para comentar dentro o fuera de las secciones en mi modelo de acuerdo con la entrada del usuario (comentar se realiza al prefijars...

4  Find-grep-sed para la búsqueda de proyectos y reemplazar  ( Find grep sed for project wide search replace ) 
Siempre olvido cómo hacer esto de manera eficiente con el Arglista de VIM. Inspiración de dibujo en una publicación en Desbordamiento de la pila , escribí un...

0  Cargando un archivo en VIM a través de la salida de tubos de AG  ( Loading a file in vim via piped output of ag ) 
Me siento como si mi escenario fuera bastante simple, pero que podría sobrecomplicarlo. Estoy buscando a través de archivos en busca de una condición especi...

3  Script de bash para administrar notas de hashtag  ( Bash script for managing hashtag notes ) 
He escrito un script simple para administrar las notas de Hashtag. No estoy familiarizado con la scriptación de bash, así que realmente lo apreciaría si alg...

4  Bash Shell Script utiliza SED para crear e insertar varias líneas después de una línea en particular en un archivo existente  ( Bash shell script uses sed to create and insert multiple lines after a particula ) 
Este código parece funcionar, pero me gustaría que alguien con Shell-Fu lo revisara. es el archivo temporal una buena idea? ¿Cómo lo haría sin? es la her...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos