Извлечь парные строки

Это зависит от того, какой файловый менеджер вы используете.

ГНОМ

Если вы используете nemoили другой файловый менеджер на основе GNOME, он, вероятно, использует GVfs (виртуальную файловую систему Gnome ), которая по умолчанию монтирует файлы в каталог ~/.gvfs/или /run/user/$USERNAME/gvfs/, где $USERNAMEзаменяется вашим именем пользователя.

КДЕ

Если вы используете KDE, вам придется использовать альтернативную команду монтирования, поскольку по умолчанию файловый менеджер KDE использует KIO, который не делает монтирование доступным для -программ, не поддерживающих KIO. См. сообщение на форуме . Однако обратите внимание, что KDE чрезвычайно настраиваемый, поэтому переключить KIOна fusesmbне составит труда. Хотя сам я этого не делал.

3
01.09.2020, 01:03
4 ответа

идентификация частей на миллион Как вы знаете, sed — это потоковый редактор, ориентированный на строку, поэтому, когда решение печатать или не печатать лежит в другой строке, как в вашем случае, нам нужно организовать конечный автомат, и в этом случае им потребуются триггеры или переменные..

По сути, нам нужно придержать печать, пока мы не увидим правильное изменение состояния. Как и в этом случае, когда мы переходим из состояния (в строку электронной почты)-> состояние (только в строку пароля ).

Использование GNU sedв расширенном режиме регулярных выражений -E, что упрощает чтение кода sed и делает его запись менее подверженной обратной косой черте.

$ sed -Ee '
    /^PASSWORD:/!{h;d;}
    x;G;s/(^|\n)[^:]*:/\1/g
' test.txt

Основная идея состоит в том, чтобы сохранить строку, которая не является строкой пароля, в регистре хранения, чтобы, когда мы действительно доберемся до строки пароля, мы могли ее использовать.

Используя GNU awk, мы по существу кодируем описанную выше функциональность sed в awk с awk-переменной e, служащей регистром хранения.

$ awk -F: '
    /^PASSWORD:/&&
    ($0=e RS $2)"";{e=$2}
' test.txt

С помощью GNU grepмы используем параметр «до» -B, чтобы перечислить одну строку перед строкой пароля, затем удалить пунктирную строку, сгенерированную grep, и предположить, что никто не использует ее в качестве пароля.

$ < test.txt \
  grep -B1 '^PASSWORD:' |
  grep -Fxve -- | cut -d: -f2-

perlможно использовать, как показано, когда мы выбираем следующую строку, а затем делаем проверки.

$ perl -ne '
    /^EMAIL:/ && ($_.= <>);
    /\nPASSWORD:/ && print(s/^[^:]+://mgr);
' tes.txt

встроенные функции bash

while IFS=: read -r a p; do
  case $a in
    'PASSWORD') printf '%s\n' "$e" "$p" ;;
    *) e=$p ;;
  esac
done < test.txt
4
18.03.2021, 23:08

Использование sedдля извлечения интересующих нас строк, а затем cutдля удаления строк PASSWORD:и EMAIL:из начала каждой строки:

$ sed -n 'N; /\nPASSWORD:/p' file | cut -d : -f 2-
user1@site.com
pass1
user2@site.com
pass2
user3@site.com
pass3
user6@site.com
pass6

Использование здесь cutпомогает упростить выражение sedи, следовательно, всю команду.

3
18.03.2021, 23:08

Если этот файл всегда в этом формате с EMAILв начале каждой второй строки:

sed -n 'N;s/^EMAIL:\(.*\n\)PASSWORD:/\1/p'

должен сделать это. Или, чтобы быть в безопасности, ищите EMAIL:как начало записи:

sed -n '/^EMAIL:/{N;s/^EMAIL:\(.*\n\)PASSWORD:/\1/p;}'

Вы также можете использовать pcregrepс его многострочным режимом:

pcregrep -M -o1 -o2 --om-separator=$'\n' '^EMAIL:(.*)\nPASSWORD:(.*)'
2
18.03.2021, 23:08
sed "N;s/\n/ /g" filename| awk -F ":" '/PASSWORD/{gsub("PASSWORD","",$2);print $2"\n"$3  }'


output

user1@site.com 
pass1
user2@site.com 
pass2
user3@site.com 
pass3
user6@site.com 
pass6

Питон

#!/usr/bin/python
m=[]
k=open('filename','r')
for i in k:
    m.append(i.strip())

for j in range(0,len(m),2):
    if "PASSWORD" in m[j+1]:
        print m[j].split(":")[-1]
        print m[j+1].split(":")[-1]
1
18.03.2021, 23:08

Теги

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