我的主要目标是复制目录的内容并将其发送到文件。然后剪切目录位置以仅包含名称。然后整理它的内容,但大多数都出现了。这也是作业,我的限制是它必须是一个命令
这就是我认为可以完成的工作,但事实并非如此
wc -l ~location/folder/folder/*.log > ~/log.info | cut -d "/" -f9 ~/log.info | sort
我的输出
1 /s/s/s/s/location/folder/folder/a.log 1 /s/s/s/s/location/folder/folder/b.log 1 /s/s/s/s/location/folder/folder/c.log 3 /s/s/s/s/location/folder/folder/d.log 2 /s/s/s/s/location/folder/folder/e.log
我想要什么
1 a 1 b 1 c 2 e 3 d
答案1
您可以通过管道输出来去除所有不需要的位sed
:
wc -l ~location/folder/folder/*.log > ~/log.info
cut -d "/" -f9 ~/log.info | sort | sed 's_/.*/__;s_\.log$__'
答案2
怎么样:
perl -e 'print sort map {s/(\d).*(\w)\..*//r} <>'
(需要 perl 5.14+ - 这可能已经安装在您的系统上)
使用一段内联的 Perl 代码:
- 读取
<>
STDIN 或命令行上指定的文件。 - 使用替换正则表达式捕获 a 之前的数字
(\d)
和字母.
(\w)\.
- 然后返回转换后的字符串。
r
正则表达式标志。 - 用于
map
迭代STDIN
. - 并
sort
......好吧,排序。 - 并
print
打印它。
输出:
1 a
1 b
1 c
2 e
3 d
或者:
perl -e '%x=map {open($f,'<',$_); @f=<$f>; $_=>''.@f} @ARGV;print "$x{$_} $_\n" for sort {$x{$a}<=>$x{$b}} keys %x;' ~location/folder/folder/*.log
答案3
wc … > ~/log.info | cut ~/log.info | …
管道的两侧平行执行。除非wc
完成得特别快并且cut
开始得特别慢,否则在cut
读取时~/log.info
,它很可能仍然是空的,甚至不存在。使问题更加复杂的是,重定向sort
也是并行执行的,并且还会截断文件。
我不明白你想用这个中间临时文件做什么。它没有用:
wc -l ~location/folder/folder/*.log | cut -d "/" -f9 | sort > ~/log.info
切换到目标目录会更简单:
{ cd ~location/folder/folder && wc -l -- *.log; } | sort > ~/log.info