Достаточно просто:
$ sed -E 's/,[^ ]+//g' in
chrX_143483005-chr6_103649292 chrX_143483110-chr_6103649147 chrX_143483004-chr6_103649293
chrX_143483110-chr_6103649147 chrX_143483005-chr6_103649292 0
0 chrX_143483005-chr6_103649292 chrX_143482988-chr6_103649147
chrX_143483005-chr6_103649292 0 chrX_143483110-chr_6103649147
0 chrX_143483005-chr6_103649292 chrX_143482988-chr6_103649147
(расширенное )регулярное выражение /,[^ ]+/
будет соответствовать любой последовательности символов, состоящей из запятой и следующей за ней последовательности символов, не являющихся пробелами.
Команда sed
s
заменит любое совпадение первого аргумента (в данном случае заданным выражением ), вторым аргументом (в данном случае ничего ); опция g
команды s
говорит, что эту замену следует выполнять для всех найденных совпадений, а не только для первого.
Вы не можете получить эту информацию из libprocps
, но ее можно получить для каждого процесса,подсчитав количество ссылок в каталоге (это эквивалент вашей команды ls /proc/[pid]/fd | wc -l
):
#include <dirent.h>
...
int fds = 0;
DIR * dirp;
struct dirent * entry;
dirp = opendir("/proc/.../fd"); /* You need to build the path */
while ((entry = readdir(dirp)) != NULL) {
if (entry->d_type == DT_LNK) {
fds++;
}
}
closedir(dirp);
Вам нужно будет добавить обработку ошибки -к приведенному выше.
Если вы хотите получить общее количество выделенных файловых дескрипторов, посмотрите на/proc/sys/fs/file-nr
:первое число — это количество выделенных файловых дескрипторов.