这可以用另一种方式完成吗
Could this be done another way
你好,我正在尝试学习 grep 正则表达式(不确定你会怎么称呼它)。我认为这是一个很好的开始方式。
下面是数据。我想提取文件名和索引节点号。
File: vimt
Size: 24 Blocks: 8 IO Block: 4096 regular file
Device: 801h/2049d Inode: 3166374 Links: 2
Access: (0644/-rw-r--r--) Uid: ( 1000/ test) Gid: ( 1000/ test)
Access: 2022-02-20 00:29:43.732363386 -0500
Modify: 2022-02-20 00:29:40.516363443 -0500
Change: 2022-02-20 00:29:40.516363443 -0500
Birth: 2022-02-20 00:28:41.196364492 -0500
File: vimhard
Size: 24 Blocks: 8 IO Block: 4096 regular file
Device: 801h/2049d Inode: 3166374 Links: 2
Access: (0644/-rw-r--r--) Uid: ( 1000/ test) Gid: ( 1000/ test)
Access: 2022-02-20 00:29:43.732363386 -0500
Modify: 2022-02-20 00:29:40.516363443 -0500
Change: 2022-02-20 00:29:40.516363443 -0500
Birth: 2022-02-20 00:28:41.196364492 -0500
File: vimhard1
Size: 24 Blocks: 8 IO Block: 4096 regular file
Device: 801h/2049d Inode: 3166372 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 1000/ test) Gid: ( 1000/ test)
Access: 2022-02-20 00:34:39.312358161 -0500
Modify: 2022-02-20 00:34:39.312358161 -0500
Change: 2022-02-20 00:34:39.312358161 -0500
Birth: 2022-02-20 00:34:39.312358161 -0500
这就是我能想到的
stat vimt vimhard vimhard1 | grep -o "File.*\|Inode.*[[:digit:]]\{7\}"
它确实给了我想要的东西
File: vimt
Inode: 3166374
File: vimhard
Inode: 3166374
File: vimhard1
Inode: 3166372
我只是想知道这是否是侥幸,因为我仍然很惊讶我能够获得我想要的数据,或者是否有更好的方法来提取它更可靠?。我只是不相信我的想法。
虽然看起来很简单,但我确实玩得很开心。
您可以使用
grep -Eo "(File|Inode):[[:space:]]*[^[:space:]]+" file
## or
awk '{for (i=1; i<=NF; i++) if ($i == "File:" || $i == "Inode:") { print $i" "$(i+1) } }' file
参见online demo。
grep
解决方案提取(-o
仅输出匹配项)以 File
或 Inode
开头的子字符串(参见 (File|Inode)
),然后 :
,然后是零个或多个空格 ([[:space:]]*
),然后是一个或多个 non-whitespace 个字符 ([^[:space:]]+
).
awk
解决方案遍历每一行的 whitespace-separated 字段,如果找到 File:
或 Inode:
字段,它会打印当前和下一个字段。
你好,我正在尝试学习 grep 正则表达式(不确定你会怎么称呼它)。我认为这是一个很好的开始方式。
下面是数据。我想提取文件名和索引节点号。
File: vimt
Size: 24 Blocks: 8 IO Block: 4096 regular file
Device: 801h/2049d Inode: 3166374 Links: 2
Access: (0644/-rw-r--r--) Uid: ( 1000/ test) Gid: ( 1000/ test)
Access: 2022-02-20 00:29:43.732363386 -0500
Modify: 2022-02-20 00:29:40.516363443 -0500
Change: 2022-02-20 00:29:40.516363443 -0500
Birth: 2022-02-20 00:28:41.196364492 -0500
File: vimhard
Size: 24 Blocks: 8 IO Block: 4096 regular file
Device: 801h/2049d Inode: 3166374 Links: 2
Access: (0644/-rw-r--r--) Uid: ( 1000/ test) Gid: ( 1000/ test)
Access: 2022-02-20 00:29:43.732363386 -0500
Modify: 2022-02-20 00:29:40.516363443 -0500
Change: 2022-02-20 00:29:40.516363443 -0500
Birth: 2022-02-20 00:28:41.196364492 -0500
File: vimhard1
Size: 24 Blocks: 8 IO Block: 4096 regular file
Device: 801h/2049d Inode: 3166372 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 1000/ test) Gid: ( 1000/ test)
Access: 2022-02-20 00:34:39.312358161 -0500
Modify: 2022-02-20 00:34:39.312358161 -0500
Change: 2022-02-20 00:34:39.312358161 -0500
Birth: 2022-02-20 00:34:39.312358161 -0500
这就是我能想到的
stat vimt vimhard vimhard1 | grep -o "File.*\|Inode.*[[:digit:]]\{7\}"
它确实给了我想要的东西
File: vimt
Inode: 3166374
File: vimhard
Inode: 3166374
File: vimhard1
Inode: 3166372
我只是想知道这是否是侥幸,因为我仍然很惊讶我能够获得我想要的数据,或者是否有更好的方法来提取它更可靠?。我只是不相信我的想法。
虽然看起来很简单,但我确实玩得很开心。
您可以使用
grep -Eo "(File|Inode):[[:space:]]*[^[:space:]]+" file
## or
awk '{for (i=1; i<=NF; i++) if ($i == "File:" || $i == "Inode:") { print $i" "$(i+1) } }' file
参见online demo。
grep
解决方案提取(-o
仅输出匹配项)以 File
或 Inode
开头的子字符串(参见 (File|Inode)
),然后 :
,然后是零个或多个空格 ([[:space:]]*
),然后是一个或多个 non-whitespace 个字符 ([^[:space:]]+
).
awk
解决方案遍历每一行的 whitespace-separated 字段,如果找到 File:
或 Inode:
字段,它会打印当前和下一个字段。