这可以用另一种方式完成吗

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 仅输出匹配项)以 FileInode 开头的子字符串(参见 (File|Inode)),然后 :,然后是零个或多个空格 ([[:space:]]*),然后是一个或多个 non-whitespace 个字符 ([^[:space:]]+).

awk 解决方案遍历每一行的 whitespace-separated 字段,如果找到 File:Inode: 字段,它会打印当前和下一个字段。