首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >查找文件grep结果,然后按文件日期时间修改进行排序。

查找文件grep结果,然后按文件日期时间修改进行排序。
EN

Ask Ubuntu用户
提问于 2020-12-25 22:05:23
回答 1查看 494关注 0票数 0

我有以下文件

代码语言:javascript
复制
**file_01.sh**  
abc  
bla bla function pause(){ 
bla
foo function juliet(){ 
foo


**file_02.sh**  
abc  
bla bla function pause(){ 
bla
bla bla jjdjdjd
foo function charlie(){ 
foo
bla bla function mike(){ 
bau


**file_03.sh**  
abc  
bla bla function pause(){ 
bla
bau


**file_04.sh**  
abc
def
bl bl function foxtrot(){ 
bla
bau


**file_05.sh**  
abc
def
ghi
bl bl function foxtrot(){ 
bla
bau

这就是我希望得到的结果:(按“文件修改日期-时间戳”排序,顶部是最近的文件):

代码语言:javascript
复制
2020/12/25    18:33:04   ./i_dir/file_04.sh:     3:bl bl function foxtrot(){ 
2020/12/25    18:33:02   ./i_dir/file_05.sh:     4:bl bl function foxtrot(){ 
2020/12/25    18:33:00   ./i_dir/file_01.sh:     4:foo function juliet(){ 
2020/12/25    18:32:56   ./i_dir/file_02.sh:     5:foo function charlie(){ 
2020/12/24    18:32:58   ./i_dir/file_02.sh:     7:bla bla function mike(){ 

这就是我到目前为止所尝试的。

命令01:

代码语言:javascript
复制
pattern_GOOD_word="(function\s){1}"
pattern_BAD_word="(function\spause){1}"

$ find "i_dir" -type f -iname "*.sh" \
 -exec grep -E -i "$pattern_GOOD_word" {} \; \
 | grep -E -v  "$pattern_BAD_word" >> "o_file_01.txt"

结果01:

代码语言:javascript
复制
**“o_file_01.txt”:**
./i_dir/file_01.sh:4:foo function juliet(){  
./i_dir/file_02.sh:5:foo function charlie(){ 
./i_dir/file_02.sh:7:foo function foxtrot(){
./i_dir/file_04.sh:3:bl bl function foxtrot(){  
./i_dir/file_05.sh:4:bl bl function foxtrot(){

但是我需要每一行都有这样的日期时间戳信息:

代码语言:javascript
复制
2020/12/25    18:33:04   ./i_dir/file_04.sh:     3:bl bl function foxtrot(){ 
2020/12/25    18:33:02   ./i_dir/file_05.sh:     4:bl bl function foxtrot(){ 
2020/12/25    18:33:00   ./i_dir/file_01.sh:     4:foo function juliet(){ 
2020/12/25    18:32:56   ./i_dir/file_02.sh:     5:foo function charlie(){ 
2020/12/24    18:32:58   ./i_dir/file_02.sh:     7:bla bla function mike(){ 
EN

回答 1

Ask Ubuntu用户

回答已采纳

发布于 2020-12-26 01:40:04

您可以使用GNU awk来尝试这样的方法:

代码语言:javascript
复制
find "i_dir" -type f -iname "*.sh" -exec gawk -v goodpat="$pattern_GOOD_word" -v badpat="$pattern_BAD_word" '
  BEGIN{cmd = "stat -c %Y "; OFS="\t"}
  $0 ~ badpat {next} 
  $0 ~ goodpat {
    cmd FILENAME | getline mtime;
    close(cmd FILENAME);
    print strftime("%Y/%m/%d\t%H:%M:%S",mtime), FILENAME, FNR ":" $0
  }
' {} \; | sort -r

您需要将pattern_GOOD_wordpattern_BAD_word表示为GNUExtended正则表达式。

代码语言:javascript
复制
pattern_GOOD_word="function[[:blank:]]"
pattern_BAD_word="function[[:blank:]]pause"
票数 1
EN
页面原文内容由Ask Ubuntu提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://askubuntu.com/questions/1302820

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档