awk 不报错的问题

本文可以回答以下问题
话题相关
#awk 和 grep 的退出状态不同
#awk 不报错
#linux 判断一个变量是否为空值

发现问题背景

写了一个shell脚本,把本来用grep的部分改用了awk,发现原来的报错部分不能用了。

比如这个用grep的代码,文件中有的单词才输出"word is in the file."

#!/bin/bash
set -euo pipefail

for a in cat dog
do
  ret=0
  grep -w $a copy.txt ||ret=$?
  if [ ${ret} -eq 1 ];then
    continue
  fi
  echo "word $a is in the file."
done

把grep的部分换成了awk,文件中没有的单词也会输出"word is in the file."
原来awk的退出状态是0,并不会像grep这样如果查询不到返回错误,即状态1。
(关于linux的退出状态 小知识 linux 退出状态码)

awk 不报错

针对某些列存在字段的缺失,awk并不会报错,而是输出空值

然而使用grep时,找到匹配的任意一行,退出状态为0,否则为1。

示例,

# 使用的文件,其中没有"cat"这个词
$ cat copy.txt 
rabbit
dog

# 用grep查找"cat",退出码为1
$ grep "cat" copy.txt
$ echo $?
1

# 用awk查找"cat",退出码为0
$ awk '/cat/{print}' copy.txt 
$ echo $?
0

问题解决

解决上面的grep代码部分更换为awk代码部分遇到的问题。
把判断退出状态码的部分,换成判断输出是否为空。

知识点,判断一个变量是否为空值,用-z

# 判断变量是否为空值
if [ -z "$STRING" ]; then
  # 处理部分
fi

修改后的使用awk的代码,

#!/bin/bash
set -euo pipefail

for a in cat dog
do
  result=$(awk '/'$a'/' copy.txt)
  if [ -z "${result}" ]; then
    continue
  fi
  echo "word $a is in the file."
done

(以上。)

你可能感兴趣的:(shell,linux,awk,linux,shell,awk)