如何从奇怪的文件中 grep“阻止”字符串

如何从奇怪的文件中 grep“阻止”字符串

AIX 上的命令是:

[root@hx042:/home/user1]$ lqueryvg -Atp hdiskpower13
0516-1396 lqueryvg: The physical volume hdiskpower13, was not found in the system database. 
Max LVs:        256 
PP Size:        30 
Free PPs:       0 
LV count:       3 
PV count:       3 
Total VGDAs:    3 
Conc Allowed:   0 
MAX PPs per PV: 1016 
MAX PVs:        32 
Quorum (disk):  1 
Quorum (dd):    ??????? 
Auto Varyon ?:  1 
Conc Autovaryon 0 
Varied on Conc: 0
Logical:        00f62b5c00004c000000014de7f073b1.1   prekod 1  
                00f62b5c00004c000000014de7f073b1.2   prekre 1  
                00f62b5c00004c000000014de7f073b1.3   prekcf 1
Physical:       00f62b5ceb80c074                1   0  
                00f62b5ceb76311b                1   0  
                00f62b5ceb790075                1   0   
Total PPs:      309 
LTG size:       128 
HOT SPARE:      0 
AUTO SYNC:      0 
VG PERMISSION:  0 
SNAPSHOT VG:    0 
IS_PRIMARY VG:  0 
PSNFSTPP:       4352 
VARYON MODE:    ??????? 
VG Type:        0 
Max PPs:        32512
Mirror Pool Str n 
Sys Mgt Mode:   ??????? 
VG Reserved:    ??????? 
PV RESTRICTION: ??????? 
Infinite Retry: 2 
Varyon State:   0 
Disk Block Size 512

我只需要这些值:

prekod
prekre
prekcf

我试过:

[root@hx042:/home/user1]$ lqueryvg -Atp hdiskpower13|sed -n -e '/Logical/,/Physical/ p'                
0516-1396 lqueryvg: The physical volume hdiskpower13, was not found in the
system database.
Logical:        00f62b5c00004c000000014de7f073b1.1   prekod 1  
                00f62b5c00004c000000014de7f073b1.2   prekre 1  
                00f62b5c00004c000000014de7f073b1.3   prekcf 1  
Physical:       00f62b5ceb80c074                1   0  

现在我陷入困境,因为Logical与我需要的第一个值在同一行,还有一个不可避免的错误消息,在这一点上根本没有用,我也不需要。

答案1

可能有一种更聪明的方法可以在 awk 中完成这一切,但 Guido 的做法是正确的,将 stderr 发送到 /dev/null 来删除该0516-1396消息。这是一个管道,用于sed仅打印“逻辑:”和“物理”之间的行,然后再次使用 sed 删除尾随的“物理”行并删除“逻辑:”文本,然后使用 awk 打印第二列:

lqueryvg -Atp hdiskpower13 | \
  sed -n '/^Logical:/,/^Physical:/ p' | \
  sed '/^Physical:/d; s/^Logical://' | \
  awk '{print $2}'

这是一个全 awk 的解决方案,但仍然相当暴力:

lqueryvg -Atp hdiskpower13 | \
  awk '/^Logical:/,/^Physical/ { 
    if (! /^Physical:/) { 
      gsub("Logical:", "", $0); 
      print $2 }}'

答案2

for i in prekod prekcf prekre; do lqueryvg -Atp hdiskpower13 | grep $i; done | sed 's/Logical://g' | sed 's/^[ \t]*//;s/[ \t]*$//' | awk '{print $2" "$3}'

答案3

我认为 cut 也可以工作,而且会更简单一些,假设输出总是相似的。对于上面引用的具体输出:

grep 'prek*' |cut -w -f3

相关内容