[리눅스 명령어 설명 백과사전] 051. 리눅스 Awk 스크립트 언어의 필드 구분자와 프로세스 제어

필드 구분 기호 설정

기본 필드 구분 기호는 공백입니다. -F "delimiter"를 사용하여 명시적으로 구분 기호를 지정할 수 있습니다.

awk -F: '{ print $NF }' /etc/passwd
# 或
awk 'BEGIN{ FS=":" } { print $NF }' /etc/passwd

BEGIN 문 블록에서 OFS="delimiter"를 사용하여 출력 필드의 구분 기호를 설정할 수 있습니다.

흐름 제어문

그 동안 Linux awk의 while, do-while 및 for 문에서는 break 및 continue 문을 사용하여 흐름 방향을 제어할 수 있으며,exit와 같은 문도 종료할 수 있습니다. break는 현재 실행 중인 루프를 중단하고 루프 외부로 점프하여 다음 문을 실행합니다. if는 프로세스 선택 사용법입니다. awk에서는 흐름 제어 문, 문법 구조 및 C 언어 유형이 있습니다. 이러한 명령문을 사용하면 많은 쉘 프로그램을 awk에 전달할 수 있으며 성능이 매우 빠릅니다. 다음은 각 문의 사용법입니다.

조건문

if(表达式)
  语句1
else
  语句2

형식의 문 1은 여러 개의 문이 될 수 있으며, 판단과 읽기의 편의를 위해 여러 개의 문을 {}로 묶는 것이 좋습니다. awk 분기 구조는 중첩을 허용하며 형식은 다음과 같습니다.

if(表达式)
  {
    
    语句1}
else if(表达式)
  {
    
    语句2}
else
  {
    
    语句3}

예:

awk 'BEGIN{
test=100;
if(test>90){
  print "very good";
  }
  else if(test>60){
    print "good";
  }
  else{
    print "no pass";
  }
}'

산출:

very good

각 명령문 뒤에는 끝에 ; 세미콜론이 올 수 있습니다.

루프 문

while문

while(表达式)
  {
    
    语句}

예:

awk 'BEGIN{
test=100;
total=0;
while(i<=test){
  total+=i;
  i++;
}
print total;
}'

산출:

5050

for 루프

for 루프에는 두 가지 형식이 있습니다.

형식 1:

for(变量 in 数组)
  {
    
    语句}

예:

awk 'BEGIN{
for(k in ENVIRON){
  print k"="ENVIRON[k];
}

}'

산출:

TERM=linux
G_BROKEN_FILENAMES=1
SHLVL=1
pwd=/root/text
...
logname=root
HOME=/root
SSH_CLIENT=192.168.1.21 53087 22

참고: ENVIRON은 awk 상수이며 하위 전형적인 배열입니다.

형식 2:

for(变量;条件;表达式)
  {
    
    语句}

예:

awk 'BEGIN{
total=0;
for(i=0;i<=100;i++){
  total+=i;
}
print total;
}'

산출:

5050

반복하다

do
{
    
    语句} while(条件)

예:

awk 'BEGIN{ 
total=0;
i=0;
do {total+=i;i++;} while(i<=100)
  print total;
}'

산출:

5050

다른 진술

  • break while 또는 for 문과 함께 사용하면 break 문으로 인해 프로그램 루프가 종료됩니다.
  • continue continue 문을 while 또는 for 문과 함께 사용하면 프로그램 루프가 다음 반복으로 이동합니다.
  • next를 사용하면 다음 입력 줄을 읽고 스크립트의 맨 위로 돌아갈 수 있습니다. 이렇게 하면 현재 입력 라인에서 추가 작업을 수행하는 것을 방지할 수 있습니다.
  • 종료 문은 기본 입력 루프를 종료하고 END가 존재하는 경우 제어를 END로 전달합니다. END 규칙이 정의되어 있지 않거나 END 내에 종료 문이 적용되면 스크립트 실행이 종료됩니다.

어레이 애플리케이션

배열은 awk의 영혼이며 텍스트 처리에서 가장 중요한 것은 배열 처리입니다. 배열 인덱스(아래 첨자)는 숫자와 문자열이 될 수 있으므로 awk의 배열을 연관 배열이라고 합니다. awk의 배열은 미리 선언할 필요가 없으며 크기를 선언할 필요도 없습니다. 배열 요소는 상황에 따라 0 또는 빈 문자열로 초기화됩니다.

배열 정의

배열 인덱스로서의 숫자(아래 첨자):

Array[1]="sun"
Array[2]="kai"

배열 인덱스로서의 문자열(아래 첨자):

Array["first"]="www"
Array"[last"]="name"
Array["birth"]="1987"

사용 시 print Array[1]은 sun을 인쇄하고, print Array[2]를 사용하면 kai를 인쇄하고, print["birth"]를 사용하면 1987을 얻습니다.

배열의 값을 읽습니다

{
    
     for(item in array) {
    
    print array[item]}; }       #输出的顺序是随机的
{
    
     for(i=1;i<=len;i++) {
    
    print array[i]}; }         #Len是数组的长度

배열 관련 함수

배열의 길이를 가져옵니다.

awk 'BEGIN{info="it is a test";lens=split(info,tA," ");print length(tA),lens;}'

산출:

4 4

길이는 문자열과 배열의 길이를 반환하고, 분할은 문자열을 배열로 분할하고, 분할하여 얻은 배열의 길이를 반환합니다.

awk 'BEGIN{info="it is a test";split(info,tA," ");print asort(tA);}'

산출:

4

asort는 배열을 정렬하고 배열의 길이를 반환합니다.

출력 배열 내용(정렬되지 않은, 정렬된 출력):

awk 'BEGIN{info="it is a test";split(info,tA," ");for(k in tA){print k,tA[k];}}'

산출:

4 test
1 it
2 is
3 a 

for...in 출력의 경우 배열이 연관 배열이므로 기본값은 순서가 지정되지 않습니다. 따라서 for...in은 순서가 지정되지 않은 배열입니다. 순서가 지정된 배열을 얻으려면 아래 첨자로 가져와야 합니다.

awk 'BEGIN{info="it is a test";tlen=split(info,tA," ");for(k=1;k<=tlen;k++){print k,tA[k];}}'

산출:

1 it
2 is
3 a
4 test

참고: 배열 첨자는 1부터 시작하는데, 이는 C 배열과 다릅니다.

키 값이 있는지 확인하고 키 값을 삭제합니다.

잘못된 판단 방법:

awk 'BEGIN{tB["a"]="a1";tB["b"]="b1";if(tB["c"]!="1"){print "no found";};for(k in tB){print k,tB[k];}}' 

산출:

no found
a a1
b b1
c

위에 이상한 문제가 있는데 tB["c"] 가 정의되어 있지 않은데 루핑을 해보면 키 값이 이미 존재하고 그 값이 비어 있는 것을 발견합니다. 여기서 awk 배열은 연관 배열이라는 점에 유의해야 합니다. . 해당 키가 배열을 통해 참조되는 한 시퀀스는 자동으로 생성됩니다.

올바른 판단 방법:

awk 'BEGIN{tB["a"]="a1";tB["b"]="b1";if( "c" in tB){print "ok";};for(k in tB){print k,tB[k];}}'  

산출:

a a1
b b1

if(key in array)는 이 메서드를 사용하여 키 값이 배열에 포함되어 있는지 확인합니다.

키 값 삭제:

awk 'BEGIN{tB["a"]="a1";tB["b"]="b1";delete tB["a"];for(k in tB){print k,tB[k];}}'                     

산출:

b b1

delete array[key]는 배열 키의 시퀀스 값에 따라 삭제될 수 있습니다.

2차원 및 다차원 배열 사용

Awk의 다차원 배열은 본질적으로 1차원 배열입니다. 더 정확하게 말하면 awk는 저장소에서 다차원 배열을 지원하지 않습니다. Awk는 2차원 배열을 논리적으로 시뮬레이션하는 액세스 방법을 제공합니다. 예를 들어 array[2,4]=1과 같은 액세스가 허용됩니다. Awk는 특수 문자열 SUBSEP(�34)를 분할 필드로 사용합니다. 위의 예에서 연관 배열 배열에 저장된 키 값은 실제로 2�344입니다.

1차원 배열의 멤버십 테스트와 유사하게 다차원 배열은 if ((i,j) in array)와 같은 구문을 사용할 수 있지만 아래 첨자는 괄호 안에 있어야 합니다. 1차원 배열의 반복 액세스와 유사하게 다차원 배열은 for(배열의 항목) 구문을 사용하여 배열을 탐색합니다. 1차원 배열과 달리 다차원 배열은 개별 첨자 구성 요소에 액세스하려면 분할() 함수를 사용해야 합니다.

awk 'BEGIN{
for(i=1;i<=9;i++){
  for(j=1;j<=9;j++){
    tarr[i,j]=i*j; print i,"*",j,"=",tarr[i,j];
  }
}
}'

산출:

1 * 1 = 1
1 * 2 = 2
1 * 3 = 3
1 * 4 = 4
1 * 5 = 5
1 * 6 = 6 
...
9 * 6 = 54
9 * 7 = 63
9 * 8 = 72
9 * 9 = 81

배열 내용은 array[k,k2]를 참조하여 얻을 수 있습니다.

또 다른 방법:

awk 'BEGIN{
for(i=1;i<=9;i++){
  for(j=1;j<=9;j++){
    tarr[i,j]=i*j;
  }
}
for(m in tarr){
  split(m,tarr2,SUBSEP); print tarr2[1],"*",tarr2[2],"=",tarr[m];
}
}'

처음부터 배우기python

[0에서 Python 배우기] 92. Python의 요청 라이브러리를 사용하여 HTTP 요청 보내기 및 응답 처리
[0에서 Python 배우기] 91. 데코레이터 및 사전을 사용하여 요청 경로에 대한 간단한 웹 애플리케이션 관리
[0에서 Python 배우기] 93. 사전 관리 사용 요청 경로
[0에서 Python 배우기] 89. WSGI를 사용하여 간단하고 효율적인 웹 서버 구축
[0에서 Python 배우기] 88. WSGI 인터페이스에 대한 자세한 설명: 간단하고 효율적인 웹 개발 실현
[0에서 Python 배우기] 87. 수동으로 구축 HTTP 서버 Python 구현 및 멀티스레드 동시 처리
[0에서 Python 학습] 86. HTTP 프로토콜에 대한 심층적인 이해와 브라우저 및 서버 통신에서 HTTP 프로토콜의 역할
[0에서 Python 학습] 85. Python 프로세스 풀의 병렬 컴퓨팅 기술 응용
[ 84. 스레드와 프로세스에 대한 심층적인 이해
[0에서 Python 배우기] 83. Python 다중 프로세스 프로그래밍과 프로세스 풀의 사용
[0에서 Python 배우기] 82. 다중 프로세스 기반 채팅 프로그램 구현 threading
[0에서 Python 배우기] 81. Python and more 스레드 통신 및 큐 응용
[0에서 Python 배우기] 80. 전역 변수에 대한 스레드 접근 및 스레드 안전성 문제
[0에서 Python 배우기] 79. 전역 변수 및 스레드에 대한 스레드 액세스 보안 문제
[제로에서 파이썬 배우기] 78. 파일 다운로드 사례
[ 제로에서 파이썬 배우기] 77. TCP 서버 프로그래밍 및 주의사항
[제로에서 파이썬 배우기] 76. 서버와 클라이언트: 네트워크 통신의 핵심 구성요소
[제로에서 파이썬 배우기] 75 .TCP 프로토콜: 신뢰성 있는 연결 지향 전송 계층 통신 프로토콜
[0에서 Python 배우기] 74. UDP 네트워크 프로그램: 포트 문제 및 바인딩 정보에 대한 자세한 설명
[0에서 Python 배우기] 73. UDP 네트워크 프로그램 - 데이터 보내기
[0에서 Python 배우기] 72. 소켓 통신 및 바인딩에 대한 심층적인 이해 소켓 생성 [0에서 Python 학습] 방법
71. 네트워크 포트 및 기능
[0에서 Python 학습] 70. 네트워크 통신 방법 및 응용: 직접 통신에서 라우터로 여러 네트워크 연결까지
[0에서 Python 학습] 69. 네트워크 통신 및 IP 주소 분류 분석
[0에서 Python 학습] 68. Python 정규식의 탐욕 모드와 비탐욕 모드
[0에서 Python 학습] 67. Python의 re 모듈: 정기적 교체 및 고급 매칭 기술
[0에서 Python 학습] 66 .정규식에 대한 심층적인 이해: 패턴 일치 및 텍스트 처리를 위한 강력한 도구
[0에서 Python 배우기] 65. Python 정규식 수정자 및 해당 응용 프로그램에 대한 자세한 설명
[0에서 Python 배우기] 64. re.compile 방법 in Python 정규식 자세한 설명
[0에서 Python 학습] 63. 정규식의 re.Match 클래스 소개 및 해당 속성과 메서드
[0에서 Python 학습] 62. Python 정규식: 강력한 문자열 일치 도구
[Python에서 학습) zero] 61. Python의 속성 속성에 대한 자세한 설명 및 적용 예
[0에서 Python 학습] 60. 탐색 생성기: 유연한 반복 도구
[0에서 Python 학습] 59. Iterator: 데이터 순회 최적화를 위한 효율적인 도구
[Python 학습 from zero] 58. 파이썬의 사용자 정의 예외와 예외 발생 방법
[0에서 Python 배우기] 57. Python에서 with 키워드를 사용하여 리소스를 올바르게 닫습니다.
[0에서 Python 배우기] 56. 프로그래밍에서 예외 처리의 중요성과 응용
[0에서 Python 배우기] 55. Python의 직렬화 및 처리 Deserialization, JSON 및 피클 모듈 적용
[0에서 Python 배우기] 54. 메모리에 데이터 쓰기
[0에서 Python 배우기] 53. CSV 파일 및 Python CSV 모듈
[0에서 Python 배우기] 52. 파일 읽기 및 쓰기 - Python 파일 조작 가이드
[ 0에서 파이썬 배우기] 51. 파이썬에서 파일 열기와 닫기 및 응용
[0에서 파이썬 배우기] 49. 파이썬에서 객체 관련 내장 함수와 사용법
[0에서 파이썬 배우기] 48 .상속과 상속에 대한 자세한 설명 및 Python의 다중 상속
[0에서 Python 학습] 47. 객체지향 프로그래밍에서 상속의 개념 및 기본 사용
[0에서 Python 학습] 46. Python의 __new__ 및 __init__ 메소드 분석 및 싱글톤 디자인 패턴
[0에서 Python 학습] 45 .Python의 클래스 메소드와 정적 메소드
[0에서 Python 배우기] 44. 객체지향 프로그래밍의 Private 속성 및 메소드
[0에서 Python 배우기] 43. Python 객체지향 프로그래밍의 예 속성 및 클래스 속성
[0에서 Python 배우기] 42. Python에 내장된 속성 및 메소드
[0에서 Python 배우기] 41. Python 매직 메소드(2)
[0에서 Python 배우기] 40. Python 매직 메소드(1)
[제로에서 파이썬 배우기] 39. 객체지향 기본 문법 및 응용 예제
[제로에서 파이썬 배우기] 38. 파이썬 패키지 사용 및 가져오기
[제로에서 파이썬 배우기] 37. 파이썬 커스텀 모듈 사용 및 주의사항
[제로에서 파이썬 배우기 ] 36. Python에서 타사 패키지 관리를 위해 pip를 사용하는 방법 및 기술
[0에서 Python 학습] 35. 일반적인 Python 시스템 모듈 및 사용법
[0에서 Python 학습] 34. Python 모듈 가져오기 및 사용에 대한 자세한 설명
[ 제로에서 파이썬 배우기] 33. 데코레이터의 역할 (2)
[제로에서 파이썬 배우기] 32. 데코레이터의 역할 (1)
[제로에서 파이썬 배우기] 31. 고차 함수와 클로저에 대한 심층적 이해 Python
[from Zero에서 Python 학습] 30. 재귀 함수와 익명 함수에 대한 심층적 이해
[0에서 Python 학습] 29. "함수 매개 변수에 대한 자세한 설명" - Python 함수 매개 변수의 다양한 사용법 이해 [
0에서 Python 학습] 28 .Python의 지역 변수와 전역 변수
[0에서 Python 배우기] 27. Python 함수의 사용 및 중첩 호출
[0에서 Python 배우기] 25. 함수: 코드 작성 효율성을 향상시키는 도구 [
0에서 Python 배우기] 24. 문자열 연산 및 Python의 순회 방법
[0에서 Python 배우기] 23. Python에서 집합(set)의 사용 방법 및 일반적인 연산
[0에서 Python 배우기] 22. Python에서 사전의 추가, 삭제, 수정 및 쿼리 및 사전의 변수
[ 파이썬을 무에서 배우다] 21. 파이썬의 튜플과 딕셔너리에서
[제로에서 파이썬 배우기] 20. 파이썬 리스트 연산 기술 및 예제
[제로에서 파이썬 배우기] 19. 리스트를 통한 루프와 리스트 중첩 적용
[제로에서 파이썬 배우기] 18. 파이썬 리스트의 기본 연산 상세 설명 (1)
[ Zero에서 파이썬 배우기] 17. Python 문자열의 형식화 방법 (2)
[0에서 Python 배우기] 16. Python 문자열의 형식화 방법 (1)
[0에서 Python 배우기] 15. 문자열 및 문자 집합 인코딩에 대한 심층적 이해
[ from Zero에서 파이썬 배우기] 14. Python 문자열의 일반적인 연산 (2) [0
에서 Python 배우기] 13. Python 문자열의 일반적인 연산 (1)
[0에서 Python 배우기] 12. Python 문자열 연산 및 응용 [
0에서 Python 배우기] 11.파이썬 루프문 및 제어 흐름
[0에서 파이썬 배우기] 10. 파이썬 조건문과 if 중첩에 대한 자세한 설명
[0에서 파이썬 배우기] 09. 파이썬의 조건 판단문
[0에서 파이썬 배우기] 08. 파이썬은 비트 연산을 이해한다 연산자, 연산자 우선순위
[0에서 파이썬 배우기] 07. 파이썬 연산자에 대한 자세한 설명: 할당, 비교, 논리 연산자
[0에서 파이썬 배우기] 06. 계산과 문자열 연결을 위해 파이썬에서 산술 연산자를 사용하기
[0에서 파이썬 배우기] 05. Python의 출력 및 입력
[0에서 Python 배우기] 04. Python 프로그래밍의 기초: 변수, 데이터 유형 및 식별자
[0에서 Python 배우기] 03. Python 대화형 프로그래밍 및 자세한 주석
[제로에서 파이썬 배우기] 02. 개발 도구 소개
[제로에서 파이썬 배우기] 01. 파이썬 설치 및 구성

추천

출처blog.csdn.net/qq_33681891/article/details/132661958