다음 awk 명령을 반복하는 가장 좋은 방법

다음 awk 명령을 반복하는 가장 좋은 방법

나는 다음과 같은 awk 진술을 가지고 있습니다

awk '/^string$/{i=1;next} i && i++ <= 2' file

그러면 문자열을 검색한 다음 2줄을 인쇄합니다.

예를 들어

$ cat file
string
aaa
bbb
ccc

$ awk '/^string$/{i=1;next} i && i++ <= 2' file
$ bbb

내가 하고 싶은 것은 2를 카운터로 변경하여 매번 10개의 행을 반복할 수 있도록 하는 것입니다. 예를 들어

for i in {1..5}
do
   awk '/^111$/{i=1;next} i && i++ <= $i' file
done

물론 이것은 작동하지 않습니다. 명령이 루프에 캡슐화되어 있기 때문에 가능한지 확실하지 않습니다.

참고로 제가 하고 싶은 일은 구성파일(file.cfg)의 [header] 값을 확인해서 해당 변수가 활성화되어 있는지(변수=활성화) 확인하는 것입니다.

예를 들어

cat file.cfg
[header]
# nothing
variable = enabled

내 생각에 핵심 속성은 [header]가 결정되지 않은 라인(아마도 라인 1, 아마도 라인 122)에 있을 것이라는 것입니다.

그리고 변수가 항상 [header] 뒤의 두 번째 줄에 있는 것은 아닙니다. 어떤 사람들은 변수를 7자리에 놓을 수도 있고, 다른 사람들은 2자리에 놓을 수도 있습니다.

이것이 의미가 있기를 바라며 미리 감사드립니다.

답변1

[header]구성 파일을 한 줄씩 사용하여 작성한 경우 다음을 variable=value사용하여 특정 섹션에 대한 모든 값을 얻을 수 있습니다.

sed -n '/^\[header\]/,/^\[/p' /path/to/file.cfg|grep -vE '?\s?[;#]'

이 섹션에서는 해당 문자로 시작하여 다음 줄까지의 sed모든 줄을 필터링합니다. 이 명령은 또는로 시작하는 줄을 필터링합니다.[header][grep;#

대신 sed를 사용할 수 있습니다 awk. 질문에 대한 이전 답변을 바탕으로https://stackoverflow.com/questions/17988756/how-to-select-lines-Between-two-marker-patterns-which-may-occurr-multiple-times-w:

awk '/\[header\]/{print; flag=1; next}/\[/{flag=0}flag' file.cfg

grep주석 줄을 필터링하려면 위 명령을 추가하면 됩니다.

답변2

셸에서는 문자열 사이에 공백 없이 연결되는 경우 문자열을 연결할 수 있습니다. 예를 들면 다음과 같습니다.

echo 'abc$def'"and so on"
abc$defand so on

따라서 귀하의 예에서는 문자열을 종료(')하고 문자열을 시작(")하여 $i쉘이 문자열을 보간할 수 있도록 합니다.

awk '/^111$/{i=1;next} i && i++ <= '"$i" file

또는 [header]문자열이 데이터 줄과 쉽게 구별될 수 있는 경우 awk의 기능을 사용하여 두 줄 사이에 명령을 실행할 수 있습니다. 예를 들어:

seq 10 | awk '/6/,/9/{print}'

6~9행이 인쇄됩니다. 따라서 자신의 수를 세고 [header1]일반적인 헤더 구문을 가정하는 대신(이스케이프해야 함) 다음 과 같은 것을 사용할 수 있습니다.[

awk '/^\[header1]/,/^\[header2]/ { print }'

관련 정보