Вы могли split
поле и использование substr
:
split($9, a, ";")
print substr(a[1], 4)
Индексы Awk запускаются в 1
.
Другая опция могла состоять в том, чтобы изменить разделитель поля ввода (FS
). FS
пространство, "", по умолчанию – который также имеет специальный эффект игнорирования продвижения и конечных пробелов.
Кроме того, вместо использования print $1, \t, ...
или printf
вариант можно было установить OFS
к вкладке.
Изменение FS:
awk -F" +|;|=" '
$3 == "gene" {
printf("%s\t%s\t%s\t%s\t%s\t%s\t\n",
$1, $4, $5, $10, $6, $7);
}
' data.file
Используя разделение:
awk '
$3 == "gene" {
split($9, a, ";")
printf("%s\t%s\t%s\t%s\t%s\t%s\t\n",
$1, $4, $5, substr(a[1], 3), $6, $7);
}
' data.file
OFS и FS:
Произведите разделителя полей (OFS
) как вкладка и альтернатива FS
внутри awk. Также обновленный FS
включать вкладку:
awk '
BEGIN {
FS="[ \t]+|;|="
OFS="\t"
}
$3 == "gene" {
print $1, $4, $5, $10, $6, $7
}
' data.file
Также посмотрите Переменные Open Group и Специальные переменные, Примеры.
Руководство простофили – обычно отмечается, когда вещами является расширение простофили awk.
Манипулирование именем в списке процессов - это обычная практика. Например. У меня в моем процессе перечислены следующие:
root 9847 0.0 0.0 42216 1560 ? Ss Aug13 8:27 /usr/sbin/dovecot -c /etc/dovecot/d
root 20186 0.0 0.0 78880 2672 ? S Aug13 2:44 \_ dovecot-auth
dovecot 13371 0.0 0.0 39440 2208 ? S Oct09 0:00 \_ pop3-login
dovecot 9698 0.0 0.0 39452 2640 ? S Nov07 0:00 \_ imap-login
ericb 9026 0.0 0.0 48196 7496 ? S Nov11 0:00 \_ imap [ericb 192.168.170.186]
Dovecot использует этот механизм, чтобы легко показать, что делает каждый процесс.
Это в основном так просто, как манипулирование параметром [0]
параметра в C. ARGV [0]
[11] ARGV
- это массив указателей на параметры, с которыми начался процесс. Таким образом, команда ls -l / ue / directory
будет иметь:
argv[0] -> "ls"
argv[1] -> "-l"
argv[2] -> "/some/directory"
argv[3] -> null
путем выделения некоторой памяти, поместив несколько текстов в этой памяти, а затем поместив адрес этой памяти в ARGV [0]
Показанное имя процесса будет изменено на новый текст.
На языке, как C
, процесс может изменить его имя путем изменения ARGV [0]
.
Пример:
#include <stdio.h>
int main(int argc, char *argv[]) {
argv[0][2] = 'A';
sleep(10);
return 0;
}
Затем компилируйте его:
$ gcc test.c
$ ls
a.out
$ ./a.out
в другом терминале:
$ ps -ef | grep '[a].out'
$ ps -ef | grep '[A].out'
cuonglm 17979 17569 0 14:51 pts/0 00:00:00 ./A.out
Язык более высокого уровня также позволяет сделать это, пример в Perl
, вы можете изменить $ 0 Переменная для изменения имени процесса.
Изменение argv [] не переносимо. В Linux вы также не можете просто изменить argv [0], чтобы он указывал на более длинную строку. Вам придется перезаписать существующие аргументы и позаботиться о том, чтобы не перезаписать переменные среды, которые следуют в адресном пространстве.
libbsd предоставляет реализацию setproctitle (3) для Linux, которая значительно упрощает эту задачу.
Существует два стандартных -Linux-способа сделать это, один из которых исходит от glibc и может быть переносим на другие системы, не -Linux:
pthread_setname_np()
вероятно лучший метод prctl()
также работает Возможно, изменение argv[0]
раньше работало, но, по крайней мере, в моей текущей системе Linux это никак не влияет на вывод в ps
.
См. этот ответ для получения более подробной информации и примера кода:https://stackoverflow.com/a/55584492/737303