![查找/排除分隔符出现一定次数的所有行的 Grep 命令?](https://linux22.com/image/47277/%E6%9F%A5%E6%89%BE%2F%E6%8E%92%E9%99%A4%E5%88%86%E9%9A%94%E7%AC%A6%E5%87%BA%E7%8E%B0%E4%B8%80%E5%AE%9A%E6%AC%A1%E6%95%B0%E7%9A%84%E6%89%80%E6%9C%89%E8%A1%8C%E7%9A%84%20Grep%20%E5%91%BD%E4%BB%A4%EF%BC%9F.png)
是否有一个 Unix 实用程序可以将文件或目录列表限制为给定的最小和最大深度级别?
我有一个 git 命令,它显示文件已更改的目录的唯一列表,git diff --name-only HEAD~3 HEAD~0 | sed 's|/[^/]*$||' | uniq
并且我想将输出进一步限制为一定数量的深度。有办法实现吗?
这是一个安装示例Drupal
。安装或更新模块后,git 命令显示添加或更改了哪些模块。模块目录是第 4 级目录,因此应切断任何更深的目录,并应从第 4 级目录中删除重复项
sites/all/modules/table_trash
sites/all/modules/table_trash/css
sites/all/modules/table_trash/drush
sites/all/modules/table_trash/js
sites/all/modules/table_trash/libraries
sites/all/modules/table_trash/libraries/variants/js
sites/all/modules/table_trash
sites/all/modules/video_filter
sites/all/modules/views_aggregator
sites/all/modules/views_aggregator/views
sites/all/modules/views_aggregator
sites/all/modules/views_aggregator/views_aggregator_more_functions
sites/all/modules/views_php
sites/all/modules/views_php/plugins/views
sites/all/modules/views_php
sites/all/modules/views_watchdog
sites/all/modules/views_watchdog/views/handlers
sites/all/modules/views_watchdog/views/plugins
sites/all/modules/views_watchdog/views/theme
sites/all/modules/views_watchdog/views
sites/all/modules/views_watchdog
这似乎是应用 grep 命令的一般情况,该命令会删除分隔符第 N 次出现后的所有行,在本例中为“/”,但我正在寻找也可以从输出中删除重复项的东西,这就是为什么在这种情况下我需要通过uniq
命令传递它。在这种情况下,最大和最小级别数都应为 4。
答案1
您可以使用这样做 - 并在此过程中消除对和 的awk
需要。适当设置sed
uniq
limit
git diff --name-only HEAD~3 HEAD~0 |
awk -vlimit=3 -F'/' -vOFS='/' -- '--NF == limit && !x[$0]++'
答案2
diff --name-only HEAD~3 HEAD~0 | sed -ne 's|/||5;t' -e 's||/|4p' | sort -u
您的命令行实际上已经做到了。您可以通过将替换命令添加到命令中来定位[num]
模式的出现。当您est 成功替换并且未指定目标abel 时,est 会从脚本中分支出来。这意味着您所要做的就是est或更多斜杠,然后打印剩下的内容。sed
s///
[num]
t
:l
t
t
s///5
p
或者,至少,它可以处理超出最大值的行。显然你也有一个最低要求。幸运的是,事情就这么简单:
sed -ne 's|/||5;t' -e 's||/|4p'
...只需将第四次出现的/
on 替换为其自身,并将您的p
rint 附加到s///
替换标志上。因为任何匹配/
5 次或更多次的行都已被修剪,所以包含 4 个/
匹配项的行仅包含 4 个。
对于uniques来说,uniq
除非它的输入被ed,否则将不起作用sort
- 所以你还是可以使用sort -u
。
运行sed ... | sort
管道打印的示例数据:
sites/all/modules/table_trash/css
sites/all/modules/table_trash/drush
sites/all/modules/table_trash/js
sites/all/modules/table_trash/libraries
sites/all/modules/views_aggregator/views
sites/all/modules/views_aggregator/views_aggregator_more_functions
sites/all/modules/views_watchdog/views