명령 출력을 텍스트로 보는 방법

명령 출력을 텍스트로 보는 방법

명령 출력을 문자열과 비교해야 합니다. 시나리오는 다음과 같습니다.

pvs_var=$(pvs | grep "sdb1") 

따라서 pvs var는 다음과 같습니다: /dev/sdb1 vg_name lvm2 a-- 100.00g 0

if [[ $($pvs_var | awk '{ print $2 }') = vg_name ]]; then
    do something
fi

문제는 if 문의 출력이 다음과 같다는 것입니다.

-bash: /dev/sdb1: Permission denied

나는이 행동을 이해하지 못합니다. 감사해요

답변1

$pvs_varawk에 문자열을 전달하는 대신 명령으로 실행 하려는 것입니다 .

이 문제를 해결하려면 echoif 문에 또는를 추가하세요.printf

if [[ $(echo "$pvs_var" | awk '{ print $2 }') = vg_name ]]; then
    do something
fi

답변2

JSON 형식으로 출력을 얻으면 보다 안정적인 방법으로 정보를 추출할 수 있습니다.

pv_info=$(pvs -o pv_all,vg_all --unit b --nosuffix --reportformat json)
sdb1_vg=$(
  printf '%s\n' "$pv_info" |
    jq -r '.report[].pv[]|select(.pv_name == "/dev/sdb1").vg_name'
)

if [ "$sdb1_vg" = vg_name ]; then...

또는 셸 대신 JSON 라이브러리와 함께 적절한 프로그래밍 언어를 사용하세요( ksh93JSON은 향후 버전에서 지원되지만).

(LVM 2.02.158(2016) 이상이 필요합니다 --reportformat json.)

하나의 쿼리만 실행하려는 경우 pvs다음과 같이 모든 작업을 수행할 수도 있습니다.

sdb1_vg=$(
  pvs -o vg_name -S pv_name=/dev/sdb1 --no-heading --config 'log{prefix=""}'
)

(LVM 2.02.107(2014) 이상이 필요합니다 -S.)

기억해변수 참조그리고피하다echo.

답변3

출력에서 VG를 비교하려면 전처리가 더 쉬울 수 있습니다.

# if you still need it
pvs_var=$(pvs | grep "sdb1") 
vg_name=$(pvs | grep "sdb1" | awk '{print $2}')
if [ "$vg_name" = "vg_name" ]; then
  echo do something
fi

뭐하세요

$($pvs_var | awk '{ $2 인쇄 }')

$( ... )명령 대체는 첫 번째 명령으로 시작됩니다 $pvs_var. Bash는 변수의 값을 충실히 바꾼 다음 실행을 시도합니다. 그것은 당신이 원하는 것이 아닙니다.

또 다른 옵션은 변수를 awk 명령에 문자열로 보내는 것입니다.

# ...
if [ $(awk '{print $2}' <<< "$pvs_var") = "vg_name" ]; then
# ...

여기서 명령 대체는 awk를 호출하고 해당 입력을 stdin(변수의 내용)에 전달하는 것입니다 $pvs_var.

답변4

awk만 사용해 볼 수 있습니다.

pvs | awk -v search='vg_name' '/sdb1/&&$2==search{exit 1}' || echo "ok"

관련 정보