¿Hay algún comando bash que te permita obtener la enésima línea de STDOUT?
Es decir, algo que llevaría esto
$ ls -l
-rw-r--r--@ 1 root wheel my.txt
-rw-r--r--@ 1 root wheel files.txt
-rw-r--r--@ 1 root wheel here.txt
y hacer algo como
$ ls -l | magic-command 2
-rw-r--r--@ 1 root wheel files.txt
Me doy cuenta de que esto sería una mala práctica al escribir scripts destinados a ser reutilizados, PERO cuando trabaje con el shell día a día, sería útil para mí poder filtrar mi STDOUT de tal manera.
También me doy cuenta de que este sería un comando semi-trivial para escribir (buffer STDOUT, devolver una línea específica), pero quiero saber si hay algún comando de shell estándar para hacerlo que estaría disponible sin que coloque un script en su lugar.
magic-command
Respuestas:
Usando
sed
, solo por variedad:El uso de esta alternativa, que parece más eficiente ya que deja de leer la entrada cuando se imprime la línea requerida, puede generar un SIGPIPE en el proceso de alimentación, que a su vez puede generar un mensaje de error no deseado:
Lo he visto con tanta frecuencia que usualmente uso el primero (que de todos modos es más fácil de escribir), aunque
ls
no es un comando que se queja cuando obtiene SIGPIPE.Para una gama de líneas:
Para varios rangos de líneas:
fuente
p
es lased
declaración que imprime las líneas identificadas por el rango de líneas que la precede. Por2,4p
lo tanto, significa imprimir las líneas 2, 3, 4.n
significa NO imprimir todas las otras líneasfuente
head -n 2 | tail -n 1
: las cabezas y las colas modernas tienden a emitir advertencias de lo contrario.head -n M | tail -n M-N+1
), y generalizar para manejar múltiples rangos no es posible.$ ls -l | awk '{if (NR>=4 && NR<=64) print}'
(puede agregar más condiciones más fácilmente, múltiples rangos, etc.)Alternativa a la agradable forma de cabeza / cola:
o
fuente
'2p'
?2
pasa si es una variable? Cada ejemplo usa comillas simples, pero con una var necesita comillas dobles. ¿Podríamos "programar" awk para que funcione también con comillas simples al usar vars? Ejemploline =1; ls | awk 'NR==$line'
. Sé quebash
usa comillas dobles con vars.De sed1line :
Desde awk1line :
fuente
En aras de la exhaustividad ;-)
código más corto
vida más corta
fuente
ls
, la pregunta original era sobre alguienSTDOUT
, así que pensé que era mejor hacerlo más grande.{ print $0 }
, entonces 'awk' NR == 3 'es una forma más corta de escribir lo mismo.Prueba esta
sed
versión:Dice "eliminar todas las líneas que no son la segunda".
fuente
Puedes usar awk:
Actualizar
El código anterior no obtendrá lo que queremos debido a un error off-by-one: la primera línea del comando ls -l es la línea total . Para eso, funcionará el siguiente código revisado:
fuente
¿Perl está fácilmente disponible para usted?
Obviamente, sustituya el número que desee por 7.
fuente
$ awk 'NR % 7' filename
para imprimir cada 7ma línea en el archivo.Otro póster sugerido
pero si conecta la cabeza hacia la cola, parece que todo hasta la línea N se procesa dos veces.
Colocando la cola en la cabeza
sería más eficiente?
fuente
Sí, la forma más eficiente (como ya lo señaló Jonathan Leffler) es usar sed con print & quit:
fuente
Hmm
sed no funcionó en mi caso. Yo propongo:
fuente
Para más integridad ..
Deseche las líneas hasta llegar a la segunda, luego imprima la primera línea después de eso. Entonces, imprime la tercera línea.
Si es solo la segunda línea ...
Ponga tantas 'lecturas como sea necesario.
fuente
Agregué esto en mi .bash_profile
Y funciona
fuente