File1.dat читается в хеш, первый столбец является ключом, второй столбец является значением. Затем File2.dat обрабатывается, и значение от хеша вставляется в массив, представляющий значения на одной строке согласно ключу, взятому сначала (в Perl, нулевом) столбец.
#!/usr/bin/perl
use warnings;
use strict;
my %tab;
open my $F1, '<', 'File1.dat' or die $!;
while (<$F1>) {
chomp;
my ($key, $value) = split /\|/; # Here, the delimiter is mentioned.
$tab{$key} = $value;
}
open my $F2, '<', 'File2.dat' or die $!;
while (<$F2>) {
chomp;
my @cols = split /\|/;
splice @cols, 1, 0, $tab{$cols[0]};
print join('|', @cols), "\n";
}
Можно получить подобный вывод со стандартом utils:
join -a2 -t'|' <(sort File1.dat) <(sort File2.dat) | sort -n
Помните, какую комбинацию полей Вы уже видели в хеше. Если комбинация является новой, распечатайте строку, иначе ничего не сделайте.
#!/usr/bin/perl
use warnings;
use strict;
use feature 'say';
my %seen;
while (<>) {
chomp;
my @fields = split /\|/, $_, 2; # Only split into 2 fields.
say unless exists $seen{$fields[1]}; # Do not print if already seen.
undef $seen{$fields[1]}; # Mark the key as seen.
}
Если у вас есть файловая система / procsystem, вы можете использовать эту последовательность команд:
find /proc/ -name tun0 | cut -d\/ -f3 | uniq | xargs -IPID lsof -p PID
Похоже, ядро не раскрывает эту информацию. Поэтому, если не считать отладки ядра, я не думаю, что вы можете это знать. Лучшее, что вы можете сделать, это перечислить все процессы, у которых есть tun
или tap
устройства, открываются следующим образом:
lsof /dev/net/tun
Это сузит круг, но в случае нескольких активных tun
взаимодействует с системой, он не сообщает вам, какой процесс каким туннелем управляет.
Когда процесс хочет создать интерфейс tun
, он открывает / dev / net / tun
независимо от того, какой интерфейс tun
он намеревается использовать. Затем он либо позволяет ядру динамически назначать новое имя интерфейса tun
(например, tun0
, tun1
, tun2
и т. Д.).) или устанавливает выбранное имя. Это делается с помощью вызова ioctl
с кодом TUNSETIFF
. Так что, пока вы не отследите этот вызов ioctl
, на самом деле нет способа узнать, какое имя было присвоено.
Ядро Linux теперь предоставляет эту информацию в /proc/$PID/fdinfo/$FD
. Например:
# grep ^iff: /proc/*/fdinfo/*
/proc/31219/fdinfo/5:iff: tun0
/proc/31235/fdinfo/5:iff: tun1
/proc/31252/fdinfo/5:iff: tun2
/proc/31267/fdinfo/5:iff: tun3
Протестировано с Debian 5.8.10.