Подстрока извлечения с помощью регулярного выражения на файле Unix

Если Вы ранее не включили своего рода аудит, нет инструмента, который может сообщить об этом после того, как файл был изменен. Можно получить дату и время того, когда файл был в последний раз изменен, но не история пересмотра.

Продвижение, Вы могли установить, установить, включить auditd пакет.

От auditctl страница справочника:

-w path
    Insert  a  watch for the file system object at path. You cannot insert
    a watch to the top level directory. This is prohibited by the  kernel. 
    Wildcards  are not supported either and will generate a warning. The way
    that watches work is by tracking the inode internally. If you place a 
    watch on a file, its the same as  using  the  -F  path  option  on a 
    syscall rule. If you place a watch on a directory, its the same as using
    the -F dir option on a syscall rule.  The  -w form  of  writing watches 
    is for backwards compatibility and the syscall based form is more
    expressive. Unlike most syscall auditing rules,  watches  do  not impact
    performance  based on the number of rules sent to the kernel. The only 
    valid options when using a watch are the -p and -k. If you  need to     
    anything fancy like audit a specific user accessing a file, then use 
    the syscall auditing form with the path or dir fields.

Существует больше дискуссии об этом в вопросе, Регистрирующем создания скрытого файла

4
26.06.2013, 11:49
6 ответов

Гну grep

grep -oE '[[:alpha:]]+_[[:digit:]]+_[[:alpha:]]+_[[:digit:]]+' 

Используйте флаг perl-regex и оглянитесь и предварительные утверждения, чтобы гарантировать, что соответствие окружается /

grep -oP '(?<=/)[[:alpha:]]+_[[:digit:]]+_[[:alpha:]]+_[[:digit:]]+(?=/)'
7
27.01.2020, 20:47

Один путь с awk:

awk -F/ '{for(i=1;i<=NF;i++)$0=($i~/_/)?$i:$0}1' file
2
27.01.2020, 20:47

Это должно сделать то, в чем Вы нуждаетесь.

Содержание tstfile.txt:

/ABC/RTE/AD_900_VOP_123/OPP
/ABC/RTE/TRE/AD_900_VOP_145/BBB
/ABC/RTE/AN_900_VFP_124/FBF
/ABC/RTE/HD_900_FOP_153/WEW
/ABD/RDV/AD_900_VOP_123/OPP
/ABC/RTE/WD_900_VOP_123/GRR/TRD
/ABC/RTE/RTD/AR_900_VOP_443/SDD

Команда для преобразования tstfile.txt:

$ sed 's|.*/\([0-9_A-Z]\+900[0-9_A-Z]\+\)/.*|\1|' tstfile.txt
AD_900_VOP_123
AD_900_VOP_145
AN_900_VFP_124
HD_900_FOP_153
AD_900_VOP_123
WD_900_VOP_123
AR_900_VOP_443

объяснение

Вышеупомянутые извлечения все это затрагивает "900" до первой наклонной черты вправо, с которой встречаются в начале "900" (оставленный 9), и все до первой наклонной черты вправо в конце "900" (право на последний 0).

0
27.01.2020, 20:47
  • 1
    может Вы объяснять это в одной или двух строках –  g4ur4v 25.06.2013, 19:29
  • 2
    Привет, я просто выполнил его, но я получаю весь вход как результат $ sed 's|.*/\([0-9_A-Z]\+900[0-9_A-Z]\+\)/.*|\1|' tstfile.txt /ABC/RTE/AD_900_VOP_123/OPP /ABC/RTE/TRE/AD_900_VOP_145/BBB /ABC/RTE/AN_900_VFP_124/FBF /ABC/RTE/HD_900_FOP_153/WEW /ABD/RDV/AD_900_VOP_123/OPP /ABC/RTE/WD_900_VOP_123/GRR/TRD /ABC/RTE/RTD/AR_900_VOP_443/SDD –  g4ur4v 25.06.2013, 19:41
  • 3
    Нет, я не :) –  g4ur4v 25.06.2013, 19:46
  • 4
    , Вы выполняли его? –  g4ur4v 25.06.2013, 19:47
  • 5
    @g4ur4v - Извините я должен был спросить 8-). Какую версию sed Вы используете? Я просто выполнил то, что Вы отправили мне, и это работало просто великолепно. Можно использовать эту команду: sed --version GNU sed версия 4.2.1. –  slm♦ 25.06.2013, 19:47

Простой ответ заключается в том, что вы хотите прочитать файл каталога, с командой, подобной cat. , cat/etc или cat mydir . Конечно, поскольку это «сырые» данные, вы хотите использовать программу, которая лучше подходит отображение данных, не относящихся к ASCII, в удобном для человека пути; например, hexdump или od .

К сожалению, как обсуждалось в Когда каталоги перестали быть читаемыми как файлы? , большинство версий Unix которые были выпущены в последние два десятилетия или около того, не позволяют этого. Так что ответ на ваш вопрос может быть «найти версию Unix, которая по-прежнему позволяет читать каталоги». AIX, большинство версий BSD, и все, кроме самых последних версий Solaris, могут быть квалифицированы. Поиск Linux, который позволяет ему, может потребовать использования машины времени.

-121--94350-

В случае запуска с терминала можно

  • запустить мультиплексор терминала, такой как tmux или экран
  • разделить терминал - в tmux Ctrl B "
  • в первом окне коснуться abc.txt затем tail -f abc.txt
  • переключить Вы увидите файл, созданный с помощью tee update.
-121--44549-

IMHO Perl предлагает самое простое и гибкое решение:

perl -nE 'say $1 if m{/(\w+\d+\w+\d+)/};' input_file

Обратите внимание, что input _ file является необязательным: STDIN будет отфильтрован, если/если имя входного файла не указано.

2
27.01.2020, 20:47

Возможно, вам не нужно сравнивать md5sum, если у вас есть доступная утилита diff.

if ! diff "$file1" "$file2" >/dev/null 2>&1; then
  echo "$file1 and $file2 does not match" >&2
  ## INSERT-YOUR-COMMAND/SCRIPT-HERE
  ## e.g. cp "$file1" "$file2"
fi

в! отрицает, например, true, если оператор имеет значение false

Предостережение состоит в том, что требуется исходный файл для сравнения с diff, который (imo) совпадает со сценарием md5sum выше.

-121--47555-

На машине CentOS 6.5 для настройки logrotatefor nginx я должен был сделать это:

logrotate /etc/logrotate.d/nginx

И затем я проверил, если logrotate заботиться о моей новой конфигурации nginx, как это:

cat /var/lib/logrotate.status
-121--3471-
sed 's|.*/\([^/]*_[^/]*\)/.*|\1|
' <<\INPUT
/ABC/RTE/AD_900_VOP_123/OPP 
/ABC/RTE/TRE/AD_900_VOP_145/BBB 
/ABC/RTE/AN_900_VFP_124/FBF 
/ABC/RTE/HD_900_FOP_153/WEW 
/ABD/RDV/AD_900_VOP_123/OPP 
/ABC/RTE/WD_900_VOP_123/GRR/TRD 
/ABC/RTE/RTD/AR_900_VOP_443/SDD
INPUT

Это приведет к удалению до второго-последнего вхождения символа /, непосредственно предшествующего символу _ в строке, сохранит все, что находится между этим и следующим вхождением /, а затем удалит остальное.

Вышеуказанная команда печатает....

AD_900_VOP_123 
AD_900_VOP_145 
AN_900_VFP_124 
HD_900_FOP_153 
AD_900_VOP_123 
WD_900_VOP_123 
AR_900_VOP_443
0
27.01.2020, 20:47

Части, которые вы не хотите, имеют чесушку и три символа.

Часть, которую вы хотите сохранить, также начинается с Slash и имеет более трех символов, но третий символ является подчеркиванием, поэтому мы удаляем все детали, которые выглядят как / XXX , но не / XX_

Это оставляет ведущую косушку на части, которую мы хотим сохранить, поэтому мы, наконец, также удалили эту косулью.

SED 'S | /..[^__] || G; S | ^ / || '

Объяснение:

Команда SED состоит из двух S (замененные команды), разделенные ; ; . Поскольку у нас есть косой в регулярном выражении, я использую S | ... | ... | вместо обычного S /.../.../

Оба Управляющие команды имеют вторую часть пустой - замените ничем = удалить эту часть. Первый использует G Global, другими словами, делают его снова и снова, пока нечего заменить.

[^ _] совпадает с чем-либо, кроме подчеркивания. T

0
27.01.2020, 20:47

Теги

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