2013-10-22 5 views
1

에서 특정 문자열을 읽어 여기에 파일 내용이다 :쉘 스크립트 파일

CPU revision : 0 
Hardware  : nomen TOS 9900 (Flattened Device Tree) 
Revision  : nomen TOS 8800 (Flattened Device Tree) 
Serial   : 0000 

, 나는이 파일을 읽을 만 9900 (하드웨어에서 : 선) 얻을 필요가 리눅스 쉘 스크립트를 사용하여 문자열로는, 가장 좋은 방법은 무엇입니까? 감사!

+0

무엇을 시도 했습니까? 우리에게 당신의 일을 보여 주면 버그 수정에 도움을 줄 것입니다. 그리고 샘플 입력에서 * "하드웨어"라인의 다른 가능한 값은 무엇입니까? * – ghoti

답변

1

제공된 정보의 범위를 감안할 때 이것은 다양한 도구를 사용하여 정말 쉬운 작업입니다.

$ awk '$1=="Hardware"{print $5}' sample.txt 

Awk는 표현식에 일치하는 것을 찾은 다음 공백으로 구분 된 입력란을 구분합니다. $1이 첫 번째 단어이고 $5은 다섯 번째 "단어"입니다.

$ sed -ne '/^Hardware/s/[^0-9]//gp' sample.txt 

sed 명령은 특정 정규식과 일치하는 행에서 명령을 실행할 수도 있습니다. 이 경우, "Hardware"라인의 경우, 모든 숫자가 아닌 문자를 null로 대체합니다. 숫자는 분명히 숫자입니다. 이것은 필드가 아닌 유형별로 구분됩니다. (당신은 당신이 달성하려고했는지 언급하지 않았다.) 마지막으로

를 실행 한 다음, 외부 도구를 사용하지 않고

$ readarray -t stuff < sample.txt 
$ for line in "${stuff[@]}"; do this=($line); test "${this[0]}" = "Hardware" && echo "${this[4]}"; done 

이 혼자 떠들썩한 파티를 사용하여 라인을 찾습니다. 이러한 종류의 배열 참조는 Bourne 스타일의 이전 쉘에서는 작동하지 않습니다. 그러나 리눅스 나 OSX를 사용하고 있다면 쉘은 기본적으로 bash가 될 가능성이 높습니다.

"${this[4]}"에 대해 궁금한 점이 있으면 bash 배열은 0부터 번호가 매겨지기 때문에 awk 줄은 $1에서 시작하여 단어가 분할되기 때문에 "4"가됩니다.

우리는 non-bash 쉘에서도이 작업을 수행 할 수 있지만 더 많은 작업이 필요하며 아마도 한 줄의 작업이 아닐 수도 있습니다.