【问题标题】:Linux - even using exit command, it pass result to pipeLinux - 即使使用退出命令,它也会将结果传递给管道
【发布时间】:2022-01-13 10:59:04
【问题描述】:

我正在编写一个脚本,它在所有文件和目录中找到最大行长度(使用 FIND),我将文件名作为脚本参数。 我有 while 循环,它遍历所有文件并打印每个文件中最长的行。在这个 while 循环遍历所有参数之后,有一个 PIPE 将这些结果传递给 awk,它应该只选择最长的一个并打印它。 这是代码:

{ while [ ! $# -eq 0 ]; do
    if [ -f "$1" ]; then    
        awk -v name="$1:" ' {
            if ( length > ln ) 
            { ln=length ;content[i=1]=$0 ;line[i]=NR } 
            else if ( length == ln )
            { content[++i]=$0 ; line[i]=NR }
        }
        END{ for(j=1;j<=i;j++) print name, line[j], ln, content[j] }' "$1"
    
    elif [ -d "$1" ]; then
        mapfile -d '' files_arr < <(find "$1" -type f \( -name "*[[:space:]]*" -o -name "*" \) -perm -a=r -print0)  
        for i in "${files_arr[@]}"; do
            awk -v name="$i:" ' {
            if ( length > ln ) 
                { ln=length ;content[i=1]=$0 ;line[i]=NR } 
            else if ( length == ln )
                { content[++i]=$0 ; line[i]=NR }
            }
            END{ for(j=1;j<=i;j++) print name, line[j], ln, content[j] }' "$i"
        done
    else
        echo "Error: '$1': File like this doesnt exist." > /dev/stderr
        exit 2
    fi
    shift
    done
} | awk ' { if ( $3>max ) { max=$3 ; result[i=1]=$0 } else if ( $3==max ) { result[++i]=$0 } } 
END{ for(j=1;j<=i;j++) print result[j] } ' 

问题是,当我有文件时,它不作为 2. 参数存在,然后我想打印错误消息并退出,但我的脚本打印错误并且还打印先前脚本参数的结果(例如第一个参数)。
再次感谢您的帮助!

【问题讨论】:

  • 请创建并发布一个minimal reproducible example(强调minimal)来说明您的问题,不要发布您在该包含 代码中的某个地方存在问题,因为这使我们更难识别问题并为您提供帮助。见How to Ask。另外,请确保包含向我们展示您使用的 shell 的 shebang。
  • 请包括您遇到的错误以及导致错误的输入。

标签: linux awk pipe exit


【解决方案1】:

将输出直接传送到awk 将并行运行while 循环和awk。因此,只要循环echos 第一个文件awk 的匹配行可以处理该行并输出结果。它不会等待首先检查所有文件。

如果你想只输出一个错误信息并且在第二个文件不存在的情况下退出你应该首先检查这个:

if ! [ -f "$2" ]; then
  echo "'$2' is not a file" >&2
  exit 1
fi

如果您需要检查每个参数,您可以扩展 $@:

for file in "$@"; do
  if ! [ -f "$file" ]; then
    echo "'$file' is not a file" >&2
    exit 1
  fi
done

否则,您可以尝试将 while 循环的输出捕获/缓冲到变量或临时文件中,并在成功处理所有文件后将其通过管道传输到 awk

【讨论】:

  • 谢谢先生,这真的很有帮助
猜你喜欢
  • 1970-01-01
  • 2018-05-27
  • 1970-01-01
  • 2015-08-03
  • 2021-09-24
  • 2021-07-19
  • 2012-10-30
  • 2021-05-24
  • 1970-01-01
相关资源
最近更新 更多