파일에서 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를 전혀 사용하지 마십시오. 쉘은 파일과 프로세스, 도구에 대한 시퀀스 호출을 조작하기 위해 존재하며, 이것이 바로 여러분이 수행하는 작업입니다. 특정 명령에 대한 시퀀스 호출에 대한 스크립트를 작성하는 것입니다. 이 과정의 일부로 두 문자열을 비교하기 위해 쉘에서 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"

관련 정보