2015-10-07 3 views
-2

У меня есть один файл журнала, который является файлом с разделителями пространства. Структура этогоИзвлечь строку между полями от начала до конца и от конца до начала строки - пробел - команды оболочки

пн 5 октября 23:17:52 2015 0 10.0.0.1 3989728/реж/файл name.txt XXXX Acct прото 0 *

Я хочу, чтобы иметь возможность извлечь имена файлов, которые иногда для моей удачи содержит пробел в его названии. например, «file name.txt»

Я не могу просто отрезать это, используя поле, из-за того пространства, которое иногда появляется в имени файлов.

То, как я думал об этом, заключалось в получении того, что находится между полем 8 слева направо и полем 8 справа налево.

Но я ничего не могу придумать, чтобы помочь мне в этом.

Кто-нибудь должен был сделать это раньше и может сиять свет.

Благодаря

+0

Нечто подобное должно работать: $ regex = "~ \/(?: a-z) +? \. txt ~ i"; – frosty

ответ

0

Это трудно пытаться без больших данных, но здесь грубое решение, которое будет отбрасывать десятое поле, если он не соответствует заданному шаблону. (Это работает только если есть один пробел ' ' в имени файла):

#!/bin/sh 

STORE1=$(echo "Mon Oct 05 23:17:52 2015 0 10.0.0.1 3989728 /dir/file name.txt X X X X acct proto 0 *" | awk '{print $9}') 

STORE2=$(echo "Mon Oct 05 23:17:52 2015 0 10.0.0.1 3989728 /dir/file name.txt X X X X acct proto 0 *" | awk '{print $10}') 

# if the tenth field matches the string "X" discard it 
if [ "$STORE2" != "X" ] 
then STORE1="$STORE1 $STORE2" 
fi 

printf "%s" "$STORE1" 
0

Вот быстрый тест с питоном:

import re 

txt = "Mon Oct 05 23:17:52 2015 0 10.0.0.1 3989728 /dir/file name.txt X X X X acct proto 0 *" 
print re.search("\d+(\.\d+){3}\s+\d+\s+(.*)(\s+\S+){8}",txt).group(2) 

Да, я понимаю, что это не оболочка, а регулярное выражение будет получать что-либо между (ip-адресом, целым числом) и перед последними 8 полями, когда вы пытались. Просто используйте регулярное выражение и примените его к своему скрипту.

0
echo "Mon Oct 05 23:17:52 2015 0 10.0.0.1 3989728 /dir/file name.txt X X X X acct proto 0 *" 

sed -r 's#.*/([^.]+\.[A-Za-z]*).*#\1#' logfile.txt 

Регулярное выражение можно объяснить следующим образом:

  • .*/ Матчи каждый персонаж до последней косой черты.
  • ([^.]+\.[A-Za-z]*) Соответствует всем, оттуда и до первой точки, за которой следуют буквенные символы. Это имя файла. Соответствующий текст захватывается группой.
  • .* Соответствует остальной части линии.

Вся линия поэтому замещена \1, текст, захваченное группе 1 (имя файла), а также выход на logfile.txt.

Были сделаны некоторые предположения: файл должен всегда иметь косую черту с пути, для имени файла должна быть только одна точка, а расширение состоит только из буквенных символов.

0

Спасибо всем за входные данные. Я подумал об этом немного и использовал AWK, чтобы это сделать.

Looping содержание файла из поля Я хочу, чтобы последнее поле минус 8.

файл для кошки | awk '{out = ""; для (i = 9; i < = NF-8; i ++) {out = out "" $ i}; print out} '

Смежные вопросы