Получить подстроку, присвоенную переменной

Для вашей второй формы:

sed -n '/test1/,/test2/p' file.txt | xargs > newfile.txt ; sed 's/test2/&\n/g' newfile.txt | sed -e 's/^[ \t]*//'
  • sed -n '/ test1 /, / test2 / p' file.txt -> захватить текст между test1 и test2
  • xargs> newfile.txt -> фактически превращает текст в "строку", хотя назначение xargs, возможно, иное.
  • sed 's / test2 / & \ n / g' newfile.txt -> добавить новую строку после шаблона «test2»
  • sed -e 's / ^ [\ t] * //' -> удалить пробелы в начале каждой строки.
3
15.06.2018, 11:41
2 ответа

Con sed, POSIXly:

var=$(
  ps -Ao args= | sed -n 's|.* -h:\(.*\)/component_events\.xml.*|\1|p'
)

En efecto, eso devuelve la parte de la línea de comando entre la última aparición de /component_events.xmly la última aparición antes de -h:.

Entonces, si la línea de comando fuera:

... -h:x/component_events.xml -g:y/component_events.xml

Obtendrías x/components_events.xml -g:yen lugar de x.

Podría cambiarlo a sed -n 's|.* -h:\([^ ]*\)/component_events\.xml.*|\1|p'para evitar eso, pero eso ya no sería así para los nombres de directorio que contienen caracteres de espacio.

En un sistema GNU/Linux reciente, también podría hacer:

LC_ALL=C grep -zhPo '^-h:\K.*(?=/component_events\.xml)' /proc/*/cmdline |
  tr '\0' '\n'

Lo que funcionaría para cualquier nombre de directorio.

3
27.01.2020, 21:21

Usando pgreppara encontrar el pid y/proc/$PID/cmdline:

var=$(
pgrep -f "component_events.xml" | \
    xargs -I{} sh -c "head -z -n1 /proc/{}/cmdline | tr '\0' '\n'" | \
    xargs -n1 dirname
)

Esto también funciona cuando la ruta del comando tiene argumentos y cuando se encontraron varios PID.


Explicación:

Búsqueda de PID:

pgrep -f "component_events.xml"

Para cada PID encontrado, obtenga el comando completo (/proc/PID/cmdline), pero imprima solo el comando sin argumentos(head -z -n1).

xargs -I{} sh -c "head -z -n1 /proc/{}/cmdline

Luego reemplace el final \0con nueva línea(\n):

tr '\0' '\n'"

Muestra solo el nombre de directorio:

xargs -n1 dirname
0
27.01.2020, 21:21

Теги

Похожие вопросы