2016-10-23 3 views
1

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

Например, я хочу, чтобы вытащить две части информации ... скажем, данные между /system/.../ и другой частью данных между /data/.../sales/

/user/project-x/system/ibm/nyc/data/customers/sales/yyyymmdd 
/user/project-x/system/mysql/data/regional/sales/yyyymmdd 
/user/project-x/system/mysql/london/data/customers/sales/yyyymmdd 
/user/project-x/system/oracle/data/tokyo-customers/Sales/yyyymmdd 

Так что, когда я бегу AWK сценарий, я бы оставил с ...

ibm  customers 
mysql regional 
mysql customers 
oracle tokyo-customers 

есть в любом случае, чтобы сделать этот тип пути к файлу расщепления?

ответ

2

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

awk -F/ '{print $4,$7}' test.txt 

(где test.txt ваш входной файл)

В основном вы говорите awk рассматривать косую черту как разделитель полей и поля печати # 4 и # 7.

Но чтобы ответить на ваш вопрос с полем поиска сделать это (более сложное, хотя)

awk -F/ '{a="???";b="???";for (i=0;i<NF;i++) {if (tolower($i)=="system") a= $(i+1); if (($i=="data") && (tolower($(i+2))=="sales")) b = $(i+1)}; print a,b}' test.txt 

Это будет разделять поля, как и раньше, но будет искать предыдущее/следующее значение полого и печати следующее/предыдущее поле. Даже если поля не находятся на фиксированных позициях, которые будут работать. Если шаблон нигде не найден, вместо него будет отображаться ???.

Я включил преобразование нижнего регистра с появлением Sales в качестве смешанного чехла.

+0

Спасибо за быстрый ответ и почти идеально, проблема в том, что я не могу полагаться на поданный номер, как и в моем простом примере, столбцы, которые мне нужны, не все в столбце $ 7. Есть ли способ сделать что-то вроде подсчета позиции последнего столбца и сделать что-то вроде $ n-2? – antimuon

+0

см. Мое редактирование. Я понял, что на самом деле я не отвечаю на заданный вопрос. –

+0

Спасибо, что работает отлично, очень ценится. – antimuon

1

С sed:

sed -E 's_.*/system/([^/]+).*/data/([^/]+)/[Ss]ales/.*_\1 \2_' 
  • .*/system/([^/]+).* соответствует части после того, как /system/ и Шифрование до следующего /, и положить в захваченном группе 1

  • /data/([^/]+)/[Ss]ales/ соответствует части между /data/ и /sales/ (или /Sales/) и поставить вторую захваченную группу

  • В замене используются захваченные группы, разделенные пробелом

Пример:

$ cat file.txt 
/user/project-x/system/ibm/nyc/data/customers/sales/yyyymmdd 
/user/project-x/system/mysql/data/regional/sales/yyyymmdd 
/user/project-x/system/mysql/london/data/customers/sales/yyyymmdd 
/user/project-x/system/oracle/data/tokyo-customers/Sales/yyyymmdd 

$ sed -E 's_.*/system/([^/]+).*/data/([^/]+)/[Ss]ales/.*_\1 \2_' file.txt 
ibm customers 
mysql regional 
mysql customers 
oracle tokyo-customers 
+0

Это замечательно, очень гибко! – antimuon

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