긴 grep 패턴을 여러 줄로 분할

긴 grep 패턴을 여러 줄로 분할

스크립트를 더 읽기 쉽게 만들기 위해 긴 grep 패턴을 분할해 보았습니다. 그게 가능합니까?

예를 들어, 이 긴 줄 대신 bash 스크립트를 통해

smartctl -a /dev/sda | grep -Ei "Spin_Retry_Count|Calibration_Retry_Count|Reallocated_Event_Count|Offline_Uncorrectable|Reallocated_Sector_Ct|Current_Pending_Sector|CRC_Error_Count|Multi_Zone_Error_Rate|Temperature|CRC_Error_Count|Runtime_Bad_Block|Erase_Fail_Count|Program_Fail_C|End-to-End_Error" | awk '{print $2" "$10}')

더 읽기 쉽게 만들기 위해 이와 같은 것으로 나누고 싶습니다.

smartctl -a /dev/sda | grep -Ei "Spin_Retry_Count|"\
                                   "Calibration_Retry_Count|"\
                                   "Reallocated_Event_Count|"\
                                   "Offline_Uncorrectable|"\
                                   "Reallocated_Sector_Ct|"\
                                   "Current_Pending_Sector|"\
                                   "CRC_Error_Count|"\
                                   "Multi_Zone_Error_Rate|"\
                                   "Temperature|"\
                                   "CRC_Error_Count|"\
                                   "Runtime_Bad_Block|"\
                                   "Erase_Fail_Count|"\
                                   "Program_Fail_C|"\
                                   "End-to-End_Error" | awk '{print $2" "$10}')

답변1

"backslash-newline-whitespace" 시퀀스는 단일 공백으로 대체되므로 패턴에 공백을 추가하게 됩니다.

Bash 배열을 사용하면 다음과 같이 읽을 수 있는 코드를 생성할 수 있습니다.

words=(
    "Spin_Retry_Count"
    "Calibration_Retry_Count"
    "Reallocated_Event_Count"
    "Offline_Uncorrectable"
    "Reallocated_Sector_Ct"
    "Current_Pending_Sector"
    "CRC_Error_Count"
    "Multi_Zone_Error_Rate"
    "Temperature"
    "CRC_Error_Count"
    "Runtime_Bad_Block"
    "Erase_Fail_Count"
    "Program_Fail_C"
    "End-to-End_Error"
)
# join the words with pipes
pattern=$( IFS='|'; echo "${words[*]}" )

smartctl -a /dev/sda | grep -Ei "$pattern" | awk '{print $2, $10}'

우리를할 수 있는GNU awk는 grep의 기능을 수행할 수 있지만 약간 장황할 수 있으므로 파이프라인에서 grep을 제거합니다.

smartctl -a /dev/sda | gawk -v p="$pattern" -v IGNORECASE=1 '$0 ~ p {print $2, $10}'

관련 정보