【问题标题】:use awk variable in bash script在 bash 脚本中使用 awk 变量
【发布时间】:2023-03-30 02:07:01
【问题描述】:

我有一个打击格式的txt文件:

66.57.21 - john
88.43.23 - albert
10.10.11 - smith

我想为每一行执行“connect.py 66.57.21 john”,我写了这个 bash 脚本:

#!/bin/bash
while read LINE; do
awk -v number = "$LINE" '$1'
awk -v name = "$LINE" '$3'
  connect.py $name $number
done < "$1"

但是 bash 脚本不起作用

有什么问题

【问题讨论】:

标签: bash awk


【解决方案1】:
#!/usr/bin/env bash
while read -r number _ name; do
  connect.py "$name" "$number"
done < "$1"

【讨论】:

  • 嘿!如果 connect.py 从标准输入读取,connect.py "$name" "$number" &lt; /dev/tty 可能会更安全。
【解决方案2】:

如果您想使用 awk,这里有一种方法:

awk -F" " '{system("connect.py " $3 " " $1)}' input.txt

-F" " 在空格上分割每一行输入

$1 是数组中的第一个单词(原题中的数字)

$3是他在数组中的第三个单词(原问题中的名字)

"connect.py " $3 " " $1 包裹在system() 中会导致shell 在替换完成后执行命令

即:connect.py john 66.57.21

【讨论】:

  • 在脚本中要避免的一件事是在循环中生成子shell。这使得 shell 脚本 S L O W.... 在这里,您每次迭代都会产生 9 个子 shell。命令替换产生一个子shell。每个管道都有一个子shell,并且您在管道的任一侧都有命令。哎哟!如果您正在阅读 1000 左右行,没问题,如果它是 1,000,000 - 去吃午饭,然后再回来查看。始终尝试限制或消除这种类型的行为。在这里,如果您想使用awk,您可以在一次调用awk 中完成整个操作,并使用system() 进行连接。建议 - 没有叮当声。
  • 另外,您正在提交一个UUOc不必要地使用cat,也称为无用使用cat)。每当您执行cat file ... 并且没有连接文件时,它就是一个UUOc。通常被视为cat file | someUtility。见Useless Use of Cat。相反,所有实用程序都将文件名作为参数或在stdin 上输入。所以它是正确的someUtility filesomeUtility &lt; file。 ...:)
  • 您还有未加引号的变量,使用read 会破坏包含转义的行,不恰当地使用所有大写变量名称等。将您的脚本复制/粘贴到shellcheck.net 和它会告诉你一些问题。
  • 谢谢你们。我已根据您的集体反馈进行了更新。让我知道你的想法。
猜你喜欢
  • 2016-09-24
  • 2016-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-13
  • 1970-01-01
  • 2021-11-04
  • 2011-03-07
相关资源
最近更新 更多