помогите с помощью командной строки извлечь фрагменты данных на стандартный вывод - PullRequest
0 голосов
/ 08 апреля 2011

Я бы хотел получить следующую строку / данные:

/work/foo/processed/25
/work/foo/processed/myproxy
/work/foo/processed/sample

= или =

25
myproxy
sample

Но было бы полезно, если бы я увидел оба.

Из этого вывода, используя cut или perl или что-нибудь еще, что будет работать:

Found 3 items
drwxr-xr-x   - foo_hd foo_users          0 2011-03-16 18:46 /work/foo/processed/25
drwxr-xr-x   - foo_hd foo_users          0 2011-04-05 07:10 /work/foo/processed/myproxy
drwxr-x---   - foo_hd testcont           0 2011-04-08 07:19 /work/foo/processed/sample

Выполнение cut -d" " -f6 даст мне foo_users, testcont. Я попытался увеличить поле до более высоких значений, но я просто не могу получить то, что хочу.

Я не уверен, что cut подходит для этого или что-то вроде Perl? Базовые каталоги останутся неизменными /work/foo/processed.

Также мне нужно удалить первую строку Found Xn items. Спасибо.

Ответы [ 6 ]

1 голос
/ 09 апреля 2011
perl -lanF"\s+" -e 'print @F[-1] unless /^Found/' file 

Вот объяснение используемых параметров командной строки:

-l: remove line break from each line of input, then add one back on print
-a: auto-split each line of input into an @F array
-n: loop through each line of input
-F: the regexp pattern to use for the auto-split (with -a)
-e: the perl code to execute (for each line of input if using -n or -p)

Если вы хотите просто вывести последнюю часть пути к каталогу, а basedir всегда будет '/ work /фу / обработано ', я бы сделал это:

perl -nle 'print $1 if m|/work/foo/processed/(\S+)|' file
1 голос
/ 09 апреля 2011

Вы можете сделать замену от начала до первого вхождения /, (не жадно)

$ your_command | ruby -ne  'print $_.sub(/.*?\/(.*)/,"/\\1") if /\//'
/work/foo/processed/25
/work/foo/processed/myproxy
/work/foo/processed/sample

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

$ ruby -ne  'print $_.split(/\s+\d+:\d+\s+/)[-1] if /\//' file
/work/foo/processed/25
/work/foo/processed/myproxy
/work/foo/processed/sample

С awk,

$ awk -F"[0-9][0-9]:[0-9][0-9]" '/\//{print $NF}' file
 /work/foo/processed/25
 /work/foo/processed/myproxy
 /work/foo/processed/sample
0 голосов
/ 09 апреля 2011

Попробуйте это:

<Your Command> | grep -P -o '[\/\.\w]+$' 

OR if the directory '/work/foo/processed' is always static then:

<Your Command>| grep -P -o '\/work\/foo\/processed\/.+$' 

-o : Show only the part of a matching line that matches PATTERN.
-P : Interpret PATTERN as a Perl regular expression.

В этом примере последнее слово в вводе будет сопоставлено. (Слово может также содержать точку (и)), поэтому имена файлов, такие как 'text_file1.txt', могут совпадать). Конечно, вы можете изменить шаблон согласно вашему требованию.

0 голосов
/ 09 апреля 2011
your_command | perl -pe 's#.*/##'
0 голосов
/ 08 апреля 2011

возьмите вывод вашей команды ls и передайте его в awk

your command|awk -F'/' '{print $NF}' 
0 голосов
/ 08 апреля 2011

Если вы знаете, что столбцы будут одинаковыми, и вы всегда перечисляете полное имя пути, вы можете попробовать что-то вроде:

ls -l | cut -c79-

, что бы вырезать 79-й символ до конца.Это может работать в этом конкретном случае, но я думаю, что было бы лучше найти базовое имя последнего поля.Вы можете легко сделать это в awk или perl.Ответьте, если это не то, что вам нужно, и я добавлю версии awk и perl.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...