나는 라인 수를 세고 에서 멈추는 bash 스크립트를 Linux 머신에 작성하려고 합니다. Firmware state: Rebuild
그런 다음 해당 라인 번호를 가져오고(예: 라인 번호 0이 첫 번째 라인이므로 15 -1 = 14) 변수에 저장하려고 합니다. . 어떻게 해야할지 모르겠어서 도움을 요청했습니다.
Firmware state: Online, Spun Up
Firmware state: Online, Spun Up
Firmware state: Online, Spun Up
Firmware state: Online, Spun Up
Firmware state: Online, Spun Up
Firmware state: Online, Spun Up
Firmware state: Online, Spun Up
Firmware state: Online, Spun Up
Firmware state: Online, Spun Up
Firmware state: Online, Spun Up
Firmware state: Online, Spun Up
Firmware state: Online, Spun Up
Firmware state: Online, Spun Up
Firmware state: Online, Spun Up
Firmware state: Rebuild
Firmware state: Online, Spun Up
고쳐 쓰다
하드 드라이브가 슬롯 0에 연결되지 않으면 제대로 작동하지 않는 문제를 발견하기 전까지는 정상적으로 작동했습니다.
[root@la43 ~]# /opt/MegaRAID/MegaCli/MegaCli64 -PDList -aALL | grep -e "Firmware state" -e "Slot"
Slot Number: 4
Firmware state: Rebuild
Slot Number: 5
Firmware state: Online, Spun Up
Slot Number: 6
Firmware state: Online, Spun Up
Slot Number: 7
Firmware state: Online, Spun Up
Slot Number: 8
Firmware state: Online, Spun Up
Slot Number: 9
Firmware state: Online, Spun Up
Slot Number: 10
Firmware state: Online, Spun Up
Slot Number: 11
Firmware state: Online, Spun Up
Slot Number: 12
Firmware state: Online, Spun Up
Slot Number: 13
Firmware state: Online, Spun Up
Slot Number: 14
Firmware state: Online, Spun Up
Slot Number: 15
Firmware state: Online, Spun Up
그래서 내가 필요한 것은 대답에서 슬롯 번호 4를 얻는 것입니다. 따라서 펌웨어 상태를 가져와야 합니다. 라인 1을 다시 빌드한 다음 -1을 사용하여 라인 0을 가져온 다음 슬롯 번호 4를 가져옵니다.
따라서 var는 결국 4가 됩니다.
어떻게 해야 합니까?
티아
답변1
그리고 awk
:
$ var=$(awk '$0=="Firmware state: Rebuild"{print --NR; exit}' file)
$ echo "$var"
14
awk
현재 행이 동일 Firmware state: Rebuild
하고 스크립트가 종료되면 스크립트는 입력 레코드 번호에서 1을 뺀 값을 인쇄합니다. 그런 다음 $(...)
명령 대체의 출력을 변수에 할당합니다 var
.
답변2
이렇게 하면 원하는 작업이 수행됩니다.
$ var=$(( $(grep -m1 -n 'Firmware state: Rebuild' file | cut -d: -f1) -1 ))
$ echo $var
14
설명하다
grep -m1 -n 'Firmware state: Rebuild'
-m 1
: 일치하는 첫 번째( ) 줄을 검색Firmware state: Rebuild
하고 줄 번호(-n
)를 포함하여 해당 줄을 인쇄합니다.$ grep -m1 -n 'Firmware state: Rebuild' file 15:Firmware state: Rebuild
cut -d: -f1
:위의 출력은grep
파이프로 연결되어cut
필드:
구분자 역할을 하고 줄 번호인 첫 번째 필드를 인쇄합니다. *var=$(( $(command) -1 ))
: 이$(( ))
구성을 사용하면 수학적 연산을 수행할 수 있습니다. 예를 들어:$ echo $((10-2)) 8
이
$(command)
구조를 사용하면 다음을 사용할 수 있습니다.산출명령은 변수인 것처럼 작동합니다. 따라서$(( $(command) -1 ))
의 출력에서 1을 뺀 결과가 인쇄됩니다command
.command
위 출력grep | cut
은 행번호( ) 이므로15
행번호에서 1을 뺀 값이 로 저장됩니다$var
.
위의 솔루션은 Firmware state: Rebuild again
하위 문자열과 유사하거나 다른 항목을 포함하는 줄도 일치시킵니다. Firmware state: Rebuild
전체 줄에 만 포함된 경우에만 일치하는지 확인해야 하는 경우 Firmware state: Rebuild
대신 다음을 사용하세요.
var=$(( $(grep -xm1 -n 'Firmware state: Rebuild' file | cut -d: -f1) -1 ))
답변3
var=$(grep -n "Firmware state: Rebuild" filename| awk -F ":" '{print $1-1}')
이것은 0부터 시작하는 줄 번호를 계산하기 위해 awk
대체 및 쉘 산술을 사용하는 terdon의 대답의 변형입니다 .cut
답변4
sed -n '/Rebuild$/!d;=' file
또는 안티패턴을 사용하세요:
sed -n '/,/d;=' file
15
주어진 패턴을 사용하여 줄 번호를 인쇄합니다. 이 경우 추가적인 수학적 연산이 필요합니다.
sed -n '/Rebuild$/Q;=' file
또는 안티패턴을 사용하세요:
sed -n '/,/!Q;=' file
1
2
3
4
5
6
7
8
9
10
11
12
13
14
패턴을 일치시키기 전에 줄 번호를 인쇄하십시오. 여기에서는 q
명령 대신 명령을 사용할 수 있습니다 Q
.
명령으로 마지막 값을 구분해야 합니다 | tail -1
. 또는 더 복잡한 방식으로:
: $(sed -n '/,/!q;=' file)
echo $_
14