
나는 라인 수를 세고 에서 멈추기 위해 Linux 머신에 bash 스크립트를 작성하려고 합니다. 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인 재구축, 라인 0을 얻기 위해 -1, 그런 다음 슬롯 번호 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