我想在我的代码库中搜索字符串的出现情况,然后获取格式化输出作为文件名、行号和代码幻灯片。我在输出的第一行得到了我想要的结果,但是接下来的行丢失了想要的格式。
$ find src/ -name "*.js" | xargs grep --null -E -n 'filter\(|map\(' | xargs -0 printf "%-100s%-5s%-100s" > test.txt
输出如下:(向右滚动查看完整行)
src/components/AppRouterSwitch.js 15: return _Routes.map((route, index) => {
src/components/forms/UserEditForm/UserEditForm.js36: const options = UserTypes.map((type, index) => <option key={index} value={type.type}>{type.name}</option>);
src/components/pages/AdminPage/SolutionManagementEditPage/SolutionManagementEditPage.js119: templates:state.templates.filter(item=>item.SOLUTIONID ==id)
src/components/pages/AdminPage/SolutionManagementEditPage/SolutionManagementEditPage.js120: .map(item=>{return{
第一行看起来正如我想要的。以下内容会丢失所需的格式。以 printf 格式字符串结尾并/n
不能解决问题。
答案1
find src/ -type f -name '*.js' -exec grep -Hn -E -- 'filter\(|map\(' {} + |
awk -F: '{printf "%-100s%-5s%-100s\n", $1, $2, substr($0, length($1) + length($2) + 3)}'
选项-H
将grep
导致它打印文件名,即使使用单个文件作为参数调用也是如此。-type f
为了跳过损坏的链接和恰好被命名的目录,需要使用 find选项*.js
。
或者更简单,完全摆脱 grep (感谢@don_crissti 的建议):
find src/ -type f -name '*.js' -exec awk '/filter\(|map\(/{printf "%-100s%-5s%-100s\n", FILENAME, FNR, $0}' {} +
答案2
man
让人有点不清楚。 “扫描将在第一次匹配时停止” - 表示将打印所有文件名,但对匹配单词的扫描将在第一次出现时停止。
GNU grep 人页面澄清了这一点:
-l
--files-with-matches
Suppress normal output; instead print the name of each input file from which output would normally have been printed. The scanning of each file stops on the first match. (-l is specified by POSIX.)
这是一个例子:
$grep -iR Intel *
2018/jan/cpu.txt:Intel i9
2018/motherboard.txt:Intel Motherboard
hardware.txt:Intel Corei7
#the same result as you provided;
$grep -iRl Intel *
2018/jan/cpu.txt
2018/motherboard.txt
hardware.txt
#the desired result