我有一个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
答案 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
这是必需的,无论如何都是如此隐含。)