Я дам вам наглядный пример, чтобы объяснить основы X11 и то, что происходит в фоновом режиме:
В этом примере у вас есть локальный сервер X11 -с двумя «экранами» на вашем hostA. Обычно используется только один сервер с одним экраном (:0.0 ), который распространяется на все ваши мониторы (и значительно упрощает работу с несколькими -мониторами ). hostB имеет два X-сервера, где второй не имеет физического дисплея (, например. виртуальный фреймбуфер для VNC ). hostC — это безголовый сервер без каких-либо мониторов.
клемма 1а, 2а, 5а, 6а:Если вы откроете локальный терминал и установите отображение на :0.0 (по умолчанию )или :0.1, вызовы рисования для ваших графических программ будут отправлены на локальный X-сервер напрямую через память.
клемма 1b, 5b:Если вы подключаетесь по ssh к какому-либо серверу, обычно отображение автоматически устанавливается на локальный X-сервер, если он доступен. В противном случае он вообще не будет установлен (, см. клемму 3 ).
клемма 2b, 6b:Если вы подключитесь к серверу по ssh,и включить переадресацию X11 -через параметр «-X», автоматически создается туннель через соединение ssh -. В этом случае TCP-порт 6010 (6000+дисплей #)на хосте B перенаправляет трафик на порт 6000 (X-сервер #0 )на хосте A. Обычно первые 10 дисплеев зарезервированы для «настоящих» серверов, поэтому переназначение ssh отображает #10 (следующий пользователь, подключающийся с помощью ssh -X, когда вы вошли в систему, затем получит #11 ). Дополнительный X-сервер не запущен, и разрешения для X -server #0 на hostA автоматически обрабатываются ssh.
клемма 4:Если вы добавите имя хоста (, например. localhost )перед дисплеем/экраном #, X11 также будет обмениваться данными через TCP вместо памяти.
клемма 3:Вы также можете напрямую отправлять команды X11 по сети, не устанавливая предварительно туннель ssh -. Основная проблема здесь в том, что ваша сеть/брандмауэр/и т. необходимо настроить, чтобы разрешить это (будьте осторожны, X11 практически не зашифрован ), и разрешения для X-сервера должны быть предоставлены вручную (xhosts или Xauthority ).
What are the relations and differences between X server, display and screen?
Отображение просто относится к какому-то X-серверу где-то . Термин «оба дисплея» относился к «:0.0» на локальном компьютере («локальный дисплей» ), равный «localhost :10.0» на цели ssh -(" Отображение TCP" ). «экраны» относятся к различным виртуальным мониторам (кадровым буферам )X-сервера. «localhost :10.0» перенаправляет только на локальный X-сервер, на цели ssh -X-сервер не запущен.
В них представлены возможные подходы к решению некоторых из различных редакций вашего вопроса:
<your-file grep '^possible[[:digit:]]' | sort | uniq -d
Дает вам лексически отсортированный список повторяющихся строк, начинающихся с possible<digit>
.
grep
выбирает строки, начинающиеся с possible
, за которыми следует хотя бы одна цифра. sort
сортирует результат так, чтобы дубликаты были смежными (, необходимыми дляuniq
). uniq -d
сообщает о дубликатах. Соответствовать любому вхождению possible<digits>
, где бы они ни находились во входных данных, при условии реализации GNU grep
или совместимости:
<your-file grep -Po 'possible\d+' | sort | uniq -d
На входе типа:
possible123xx impossible123yy
Это дало бы:
possible123
Для всех уникальных строк, содержащих повторяющиесяpossible<digit>
:
perl -lne 'if (/possible(\d+)/) {
$count{$1}++;
$lines{$1}->{$_}++;
}
END{
for $k (grep {$count{$_} > 1} keys %count) {
print for keys %{$lines{$k}}
}
}' < your-file
На входе типа:
this is the best possible solution
possible1234 solution!!!
possible5678 solution!!!
possible5678 solution!!!
possible0000 solution!
impossible0000 other solution!
Дает:
possible0000 solution!
impossible0000 other solution!
possible5678 solution!!!
(в произвольном порядке, кроме строк для заданного possibleXXXX
, они будут располагаться друг за другом ).
Для вашего исправленного примера может работать решение на основеawk
-:
awk '/possible[[:digit:]]+/ {count[$0]++;} END{for (line in count) {if (count[line]>1) print line}}' input.txt
или, если вы awk
не понимаете классы символов POSIX
awk '/possible[0-9]+/ {count[$0]++;} END{for (line in count) {if (count[line]>1) print line}}' input.txt
Это проверит каждую строку, если она содержит шаблон possible
, за которым следует хотя бы одна цифра. Если он найден, он увеличит счетчик вхождений для всей строки . В конце концов, будут напечатаны только те строки, в которых счетчик вхождений больше 1.
Обратите внимание, что это будет работать только в том случае, если ваш фактический ввод соответствует показанному. Если один и тот же шаблон possibleNNNN
может быть в разных строках, это не удастся!
Мы можем использовать следующий подход, сохраняющий порядок повторяющихся строк.
Сохраните регулярное выражение в переменной среды «re», затем найдите строку регулярного выражения с помощью команды match. В этих строках мы обновляем количество регулярных выражений, увиденных до этого, с помощью команды gsub.
$ re='\<possible[0-9]+\>' \
awk 'BEGIN { r = ENVIRON["re"] }
match($0, r) &&
(a[substr($0,RSTART,RLENGTH)] += gsub(r, "&")) == 2' logfile
Один лайнер на Perl будет:
perl -lne 'print if /\bpossible(\d+)\b/ && 2 == ($h{$1} +=()= //g)' logfile
Вы можете попробовать использовать простую команду awk ниже
awk '{if(seen[$0]++){print $0}}' file
выход
possible5678 solution!!!
possible0000 solution!
There should be some "possible7777" solution!
Питон
#!/usr/bin/python
uni=[]
full_with_duplicate=[]
k=open('p.txt','r')
for i in k:
if i.strip() not in uni:
uni.append(i.strip())
t=open('p.txt','r')
for i in t:
full_with_duplicate.append(i.strip())
for i in uni:
if full_with_duplicate.count(i) > 1:
print i
выход
possible5678 solution!!!
possible0000 solution!
There should be some "possible7777" solution!
С помощью GNU awk для \<
границы слова, \w
сокращения и 3-го аргумента для соответствия():
$ awk 'match($0,/\<possible\w*/,a) && ++cnt[a[0]]==2' file
possible5678 solution!!!
possible0000 solution!
There should be some "possible7777" solution!
Вы не указали, КАКУЮ строку с дубликатом ключа вы хотите вывести, поэтому приведенный выше вывод выводит вторую строку.