ファイルからawk findに基づいてコマンドを実行する

ファイルからawk findに基づいてコマンドを実行する

awkを使用して、ファイル内の一致する文字列に基づいていくつかのコマンドを実行しようとしています。これが正しいアプローチかどうかはわかりません。 grepの使用はこの目的に適していますか?

#!/bin/bash
file1='ip.txt'
while read line; do 
  if `awk -F: '2 == /puppetclient/'` then 
    echo "Found the IP `awk '{print $1}'` with the text `awk '{print $2}'`"
    echo "Will install puppet agent"
  fi
  if `awk -F: '2 == /puppetmaster/'` then
    echo "Found the IP `awk '{print $1}'` with the text `awk '{print $2}'`"
    echo "Will install puppet server"
  fi
done < $file1

IP.txt

{
52.70.194.83 puppetclient
54.158.170.48 puppetclient
44.198.46.141 puppetclient
54.160.145.116 puppetmaster puppet
}

答え1

awk直接使用するのではなく、ファイルを繰り返す理由が何であるかわかりません。

awk '
    /puppetclient/ {
        printf "Found the IP %s with the text %s\n", $1, $2
        printf "Will install puppet agent\n"
        system ("echo agent magic")    # Execute this command
    }
    /puppetmaster/ {
        printf "Found the IP %s with the text %s\n", $1, $2
        printf "Will install puppet server\n"
        system ("echo server magic")    # Execute this command
    }
' ip.txt

答え2

何の利点も提供せず、追加の複雑さと非効率性をもたらすため、awkをまったく使用しないでください。シェルはファイルやプロセス、ツールへのシーケンス呼び出しを操作するために存在し、これがあなたがすることです。特定のコマンドのシーケンス呼び出し用のスクリプトを作成します。このプロセスの一部として、2つの文字列を比較するためにシェルからawkなどの外部ツールを呼び出す必要はありません。

シェルで次の操作を行います。

#!/usr/bin/env bash
file1='ip.txt'
while read -r ip role rest; do
    case $role in
        puppetclient )
            echo "Found the IP $ip with the text $role"
            echo "Will install puppet agent"
            command_to_install_puppet_agent
            ;;
        puppetmaster )
            echo "Found the IP $ip with the text $role"
            echo "Will install puppet server"
            command_to_install_puppet_server
            ;;
    esac
done < "$file1"

関連情報