我试图匹配包含以下信息的文件中的模式“SHM”,并打印与该模式匹配的单词。
LOCALZONE01 ASHM001002003VOL01
BSHM001002003VOL02
CSHM001002003VOL03
DSHM001002003VOL03_DUP
ESHM001002003VOL04
FSHM001002003VOL05
GSHM001002003VOL06_
HSHM001002003VOL07
我尝试使用 awk 打印第二列:
grep "SHM" <filename.txt> | awk -F" " '{print $2}'
ASHM001002003VOL01
如果我尝试打印第 1 列,它会给出以下输出:
LOCALZONE01
BSHM001002003VOL02
CSHM001002003VOL03
DSHM001002003VOL03_DUP
ESHM001002003VOL04
FSHM001002003VOL05
GSHM001002003VOL06_
HSHM001002003VOL07
以下是我想要的输出。我怎么才能得到它?
ASHM001002003VOL01
BSHM001002003VOL02
CSHM001002003VOL03
DSHM001002003VOL03_DUP
ESHM001002003VOL04
FSHM001002003VOL05
GSHM001002003VOL06_
HSHM001002003VOL07
答案1
如果你有 GNU grep 可用,
grep -Eo '[[:alnum:]_]*SHM[[:alnum:]_]*' < filename.txt
如果没有,您可以要求 awk 循环遍历每一行的字段,查找 SHM:
awk '{ for(i=1;i<=NF;i++) if ($i ~ /SHM/) print $i }' < filename.txt
答案2
如果您想要的输出始终是文件中的最后一个字段,请尝试此操作
awk '{if ($NF ~ /SHM/) {print $NF}}' _input_file_
答案3
由于示例数据的第一列没有从第 2 行开始及以后的条目,因此您必须将其解析为fixed-width
列。你可以这样做:
$awk 'BEGIN {FIELDWIDTHS = "16 40"} /SHM/ { print $2}'
ASHM001002003VOL01
BSHM001002003VOL02
CSHM001002003VOL03
DSHM001002003VOL03_DUP
ESHM001002003VOL04
FSHM001002003VOL05
GSHM001002003VOL06_
HSHM001002003VOL07
答案4
awk 'NR==1 {print $2}' filename && awk 'NR>1' filename | sed 's/[[:space:]]*//g'
输出:
ASHM001002003VOL01
BSHM001002003VOL02
CSHM001002003VOL03
DSHM001002003VOL03_DUP
ESHM001002003VOL04
FSHM001002003VOL05
GSHM001002003VOL06_
HSHM001002003VOL07
这将打印第一行的第二列、以下几行,然后删除空格以修复格式并返回所需的输出。