帮助使用命令行在stdout上提取数据片段

时间:2011-04-08 19:13:19

标签: perl shell unix command-line

我想要提取以下字符串/数据的选项:

/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_userstestcont。我尝试将字段增加到更高的值,我只是无法得到我想要的东西。

我不确定cut是否对此有用或类似perl? 基目录将保持静态/work/foo/processed

另外,我需要删除第一行Found Xn items。感谢。

6 个答案:

答案 0 :(得分:1)

您可以从/的开始到第一次出现进行替换,(非贪婪)

$ 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

答案 1 :(得分:1)

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 / foo / processed',我会这样做:

perl -nle 'print $1 if m|/work/foo/processed/(\S+)|' file

答案 2 :(得分:0)

如果你知道列将是相同的,并且你总是列出完整的路径名,你可以尝试类似的东西:

ls -l | cut -c79-

直到结束时才会删除第79个字符。这可能适用于这种情况,但我认为最好找到最后一个字段的基本名称。您可以在awk或perl中轻松完成此操作。如果这不是你想要的,我会回复,我会添加awk和perl版本。

答案 3 :(得分:0)

获取ls命令的输出并将其传递给awk

your command|awk -F'/' '{print $NF}' 

答案 4 :(得分:0)

your_command | perl -pe 's#.*/##'

答案 5 :(得分:0)

试试这个:

<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.

在此示例中,输入中的最后一个单词将匹配。 (该单词也可以包含点(s)),因此可以匹配“text_file1.txt”等文件名。 当然,您可以根据您的要求更改模式。