Grep包含指定字符串的文件列表,并使用文件名&获取输出。想要的数据

时间:2017-11-24 14:39:37

标签: linux bash grep

我有一个ex。

的文件列表
user1.txt
user2805927.txt
admin.txt

并且在每个文件上都有一些数据,如:

unwanted data line1
unwanted data line2
unwanted data line n

Usage · 220
other lines that I don't need

我想得到的数字只是“220”而且每个文件都不同

其中一个问题是,有一个符号· ALT CODE + 250 我不能在Putty上写它

有没有办法获得输出文件名+数据,如:

users1.txt | 220
user2805927.txt | 85
admin.txt | 18

1 个答案:

答案 0 :(得分:1)

可以 grep获取任意字符代码(有几个例外 - 在GNU grep内部使用0和255)。

xargs grep -o $'\xfa.*' -m 1 <filenames.txt

Bash“C风格”字符串$'...'允许您使用十六进制字符代码\xfa(相当于十进制250)而grep -o表示只打印匹配,而不是整个线。使用-m 1我们限制每个文件中的第一个匹配,以防有几个。 xargs表示使用文件中的文件名作为命令行参数运行grep;这会导致grep也在每场比赛前打印文件名。

users1.txt:· 220
user2805927.txt:· 85
admin.txt:· 18

将此输出作为练习进行后处理。 (如果您有grep -P,则可以在十六进制代码后放置\\K,以便轻松地将其从匹配项中排除。)

以下是sed变体:

xargs -n 1 -i sed -n '/^Usage [^0-9]*/!d;s//{} | /p;q' {} <filenames.txt

如果当前行与正则表达式不匹配,请将其删除并从下一行重新开始。否则,将匹配替换为当前文件名(xargs -i用文件名替换{})并打印该行,然后退出处理当前文件。 xargs -n 1表示要为每个文件名运行sed命令的新调用(尽管-i这是必需的,无论如何都是如此隐含。)