셸 프로 그래 밍 (8): 텍스트 처리 삼 총사 awk

21385 단어 셸 프로 그래 밍
글 목록
  • awk 작업 모드
  • 문법 격식
  • awk 의 내장 변수
  • 예시
  • 포맷 출력 printf
  • 형식 설명자
  • 장식 부적
  • 예시
  • awk 모드 가 일치 하 는 두 가지 방법
  • 첫 번 째 패턴 일치: RegExp 정규 표현 식 일치
  • 두 번 째 모델 매 칭: 관계 연산 매 칭
  • awk 에서 표현 식 의 용법
  • awk 동작 중의 조건 및 순환 문
  • 조건문
  • 순환 문
  • awk 의 문자열 함수
  • 상용 문자열 함수
  • 예시
  • awk 옵션 요약
  • 전달 매개 변수
  • awk 의 배열
  • 셸 의 배열 용법
  • awk 의 배열
  • awk 배열 예제
  • awk 에서 getline 용법
  • awk 작업 모드
    문법 서식
    제1 종 형식
    awk 'BEGIN{}pattern{commands}END{}' file_name
    
  • BEGIN {} 은 텍스트 가 시작 되 기 전에 {} 내 작업 을 진행 합 니 다
  • .
  • END {} 은 텍스트 가 시 작 된 후 {} 내의 동작 을 표시 합 니 다
  • pattern 은 그 줄 들 을 조작 하고 쓰 지 않 으 면 모든 줄
  • 을 기본 으로 합 니 다.
  • {commands} 줄 에 대한 작업 은 여러 명령 의 두 번 째 형식
  • 을 쓸 수 있 습 니 다.
    cat file_name | awk 'BEGIN{}pattern{commands}END{}'
    

    awk 내장 변수
    내장 변수
    속뜻
    $0
    전체 줄 의 내용
    1 − 1- 1−n
    현재 줄 의 1 - n 번 째 필드
    NF
    현재 줄 의 필드 개수, 즉 몇 열 입 니까?
    NR
    현재 줄 의 줄 번 호 를 1 부터 계산 합 니 다.
    FNR
    여러 파일 을 처리 할 때, 모든 파일 줄 번 호 는 0 부터 계산 합 니 다.
    FS
    필드 구분자 입력.기본 값 을 빈 칸 이나 tab 로 나 누 지 않 습 니 다.
    RS
    줄 분할 기 호 를 입력 하 십시오. 기본 줄 바 꾸 기
    OFS
    출력 필드 구분자, 기본 스페이스 바
    ORS
    출력 줄 구분자.기본 리 턴
    FILENAME
    현재 입력 한 파일 이름
    ARGC
    명령 행 매개 변수 개수
    ARGV
    명령 행 매개 변수 배열
    예시
  • list 내용
  • java:python:scala
    hadoop:spark:flume
    jake:mike:coco
    
    awk 'BEGIN{FS=":"}{print $1}' list # BEGIN中指定分隔符为:
    awk 'BEGIN{FS=":"}{print NR}' list # 显示行号
    awk 'BEGIN{FS=":"}{print NF}' list # 显示每行的列数
    
    awk 'BEGIN{FS=":"}{print NF}' list list #行号为连续显示
    awk 'BEGIN{FS=":"}{print FNR}' list list1 # 每个文件是单独计算行号
    
    awk 'BEGIN{FS=":"}{print $NF}' list # 输出最后一列
    

    출력 printf 포맷
    서식 설명자
    서식 부호
    속뜻
    %s
    인쇄 문자열
    %d
    인쇄 10 진수
    수식 부호
    수식 부호
    속뜻
    -
    왼쪽 정렬
    +
    오른쪽 정렬
    +
    8 진 을 앞 에 0 으로 표시 하고 16 진 을 앞 에 0 x 로 표시 합 니 다.
    예시
    문자열 로 인쇄/etc/passwd 의 일곱 번 째 필드 를 포맷 하고 ":"을 구분자 로 합 니 다.
    awk 'BEGIN{FS=":"} {printf "%s:",$7}' /etc/passwd
    

    10 진수 인쇄/etc/passwd 의 세 번 째 필드 를 ":"로 구분 합 니 다.
    awk 'BEGIN{FS=":"} {printf "%10d
    ",$3}'
    /etc/passwd # 右对齐10个字符

    부동 소수점 인쇄
    awk 'BEGIN{FS=":"} {printf "%0.2f
    ",$3}'
    /etc/passwd # 浮点数打印 保留两位小数

    awk 모드 가 일치 하 는 두 가지 방법
    첫 번 째 패턴 일치: RegExp 정규 표현 식 일치
    예제 일치/etc/passwd 파일 에 루트 문자열 이 있 는 모든 줄
    awk 'BEGIN{FS=":"}/root/{print $0}' /etc/passwd
    

    /etc/passwd 파일 에서 yarn 으로 시작 하 는 모든 줄 과 일치 합 니 다.
    awk 'BEGIN{FS=":"}/^yarn/{print $0}' /etc/passwd
    

    두 번 째 모드 일치: 관계 연산 일치
  • 상용 관계 연산 자 지원 > < > = = = = = = =
  • 정규 표현 식 일치
  • !~정규 표현 식 과 일치 하지 않 음
  • 예제 일치/etc/passwd 의 세 번 째 필드 는 50 줄 이하 입 니 다.
    awk 'BEGIN{FS=":"}$3<50{print $0}' /etc/passwd
    

    세 번 째 필드 에 3 개 이상 의 숫자 정 보 를 포함 하 는 모든 줄 과 일치 합 니 다.
    awk 'BEGIN{FS=":"}$3~/[0-9]{3,}/{print $0}' /etc/passwd  # /[0-9]{3,}/ 固定写法
    

    불 연산 자 일치 | | 또는 & & 와!... 이 아니다
    일치/etc/passwd 파일 에 hdfs 나 yarn 을 포함 하 는 모든 줄 정보
    awk 'BEGIN{FS=":"}$1=="hdfs" || $1=="yarn" {print $0}' /etc/passwd
    

    awk 표현 식 의 용법
    기호.
    속뜻
    +
    더 하 다
    *
    곱셈
    -
    덜다
    /
    나눗셈
    %
    모형 을 뜨다
    ^ 또는 *
    제곱
    ++x
    먼저
    x++
    더하기 1
    통계/etc/services 의 빈 줄 수
    awk '/^$/{sum++} END{print sum}' /etc/services # /^$/ 表示空白行
    

    학생 점수 평균 치 를 통계 하 는 학생 과정 파일 은 다음 과 같다.
    Allen 80 90 96 98
    mike 93 98 92 91
    zhang 78 76 87 92
    
    awk 'BEGIN{printf "%-8s%-8s%-8s%-8s%-8s%-8s
    ","name","math","english","chinese","history","avg"} {total=$2+$3+$4+$5;avg=total/4;printf "%-8s%-8d%-8d%-8d%-8d%-0.2f
    ",$1,$2,$3,$4,$5,avg}'
    stu.txt

    awk 동작 중의 조건 및 순환 문
    조건문
    if(条件表达式)
    	动作1
    else if
    	动作2
    else
    	动作3
    

    예제 에 서 는/etc/passwd/의 세 번 째 필드 의 수치 가 50 - 100 범위 내 에 있 는 줄 만 인쇄 합 니 다.
    awk 'BEGIN{FS=":"}{if($3<100 && $3>50) print($0)}' /etc/passwd
    

    파일 에 명령 을 쓰 고 main. awk 를 실행 합 니 다.
    BEGIN{FS=":"}{if($4<100 && $3>50) print($0)}
    

    다음 문장 을 실행 합 니 다.
    awk -f main.awk /etc/passwd
    

    순환 문
    while 순환 do while for 순환, 문법 형식 과 c 언어 가 일치 합 니 다.예시 계산 1 + 2 + 3 + 3 +... 100 의 합, while, do while, for 순환 세 가지 방식 으로 실현
    # for循环
    BEGIN{
            for(i=0;i<=100;i++)
            {
                    sum+=i
            }
            print sum
    }
    # while 
    BEGIN{
            while(i<=100){
                    sum+=i
                    i++
            }
            print sum
    }
    #do while
    BEGIN{
            i=0
            do{
               sum+=i
               i++
            }while(i<=100)
            print sum
    }
    

    awk 의 문자열 함수
    상용 문자열 함수
    함수 명
    해명 하 다.
    함수 반환 값
    length(str)
    문자열 길이
    정수 길이 값
    index(str1,str2)
    str1 에서 str2 의 위 치 를 찾 습 니 다.
    위치 색인 을 되 돌려 1 부터 계산 합 니 다.
    tolower(str)
    소문 자로 바꾸다
    전 환 된 문자열
    toupper(str)
    대문자 로 바꾸다
    전 환 된 문자열
    substr(str,m,n)
    str 의 m 문자 부터 n 자 리 를 캡 처 합 니 다.
    캡 처 한 하위 문자열
    split(str,arr,fs)
    fs 절단 문자열 에 따라 arr 저장
    절단 후 하위 문자열 의 개수
    match(str,RE)
    str 에서 RE 에 따라 위 치 를 되 돌려 줍 니 다.
    색인 위치 되 돌리 기
    sub(RE,RepStr,str)
    str 에서 RE 에 맞 는 문자열 을 검색 하여 RepStr 로 바 꾸 고 하나만 바 꿉 니 다.
    교체 개수
    gsub(RE,RepStr,str)
    str 에서 RE 에 맞 는 문자열 을 검색 하여 RepStr 로 바 꾸 고 모든 것 을 바 꿉 니 다.
    교체 개수
    예시
    통계/etc/passwd 의 줄 마다 필드 의 길이
    BEGIN{
        FS=":"
    }
    {   i=0
        while(i<=NF)
        {
            if(i==NF){
                printf "%d",$i
            }
            else{
                printf "%d:",$i
            }
            i++
        }
        print ""
    }
    

    검색 문자열 "I have s dream"에 "ea"하위 문자열 의 위치 가 나타 납 니 다.
    # 使用index
    awk 'BEGIN{str="I have s dream";location=index(str,"ea");print location}'
    
    # 使用match
    awk 'BEGIN{str="I have s dream";location=match(str,"ea");print location}' 
    

    문자열 대소 문자 변환
    awk 'BEGIN{str="I have s dream";print tolower(str)}' 
    awk 'BEGIN{str="I have s dream";print toupper(str)}'
    

    문자열 분할
    awk 'BEGIN{str="I have s dream";split(str,arr," ");for(i in arr) print arr[i]}'
    

    하위 문자열 을 캡 처 하 다.
    awk 'BEGIN{str="I have s dream"; print substr(str,4,5)}'
    awk 'BEGIN{str="I have s dream"; print substr(str,4)}' # 第四位开始 
    

    문자열 바 꾸 기
    # 将123替换为$ 符号。sub返回的个数,直接修改str
    awk 'BEGIN{str="my 123 dream"; sub(/[0-9]+/,"$",str);print str}'
    

    awk 옵션 요약
    옵션
    해명 하 다.
    -v
    매개 변수 전달
    -f
    스 크 립 트 파일 지정
    -F
    지정 구분자
    -V
    awk 버 전 번호 보기
    전달 매개 변수
    num1=20
    var="hello world"
    awk -v num2="$num1" -v var1="$var" 'BEGIN{print num2,var1}'
    

    awk 의 배열
    셸 의 배열 용법
    정의.
    array=("Allen" "Mike" "Jick") # 空格分割
    

    배열 조작
    # 打印元素
    echo ${array[2]}
    # 打印数组元素个数
    echo ${#array[@]}
    # 打印数组元素长度
    echo ${#array[3]}
    # 给元素复制
    array[3]="Li"
    # 删除元素
    unset array[0] # 被删掉后 下标不变
    # 分片访问
    echo ${array[@]:1:3}
    # 元素内容替换
    ${array[@]/e/E} # 只替换第一个e
    ${array[@]//e/E} # 替换所有的e
    

    배열 옮 겨 다 니 기
    for a in ${array[@]}
    do
        echo $a
    done
    

    awk 의 배열
    awk 에서 배열 을 사용 할 때 1, 2, 3... 배열 로 표시 할 수 있 을 뿐만 아니 라 문자열 을 아래 표 로 사용 할 수도 있 습 니 다. 숫자 를 아래 표 로 사용 할 수도 있 습 니 다.
    str="Allen Jerry Mike"
    split(str,array)
    for(i=1;i<=length(array);i++)
    	print array[i]
    

    다음 표 로 문자열 사용 하기
    array["var1"]="Jin"
    array["var2"]="Hao"
    array["var3"]="Fang"
    for(a in array)
    	print array[a]
    

    awk 배열 예제
    tcp 링크 상태 개수 통계
    netstat -an | grep tcp | awk '{a[$6]++}END{for(i in a) print i,a[i]}'
    

    계산 가로 데이터 총합, 계산 세로 데이터 총합
  • 데이터 allen 80 90 87 91 mike 99 100 80 kobe 99 98 99 100
  • 스 크 립 트
  • BEGIN{
        printf "%-10s%-10s%-10s%-10s%-10s
    "
    ,"name","yuwen","math","english","total" } { total=$2+$3+$4 yuwen_sum+=$2 # 列之间的数累加 math_sum+=$3 enlish_sum+=$4 printf "%-10s%-10s%-10s%-10s%-10s
    "
    ,$1,$2,$3,$4,total } END{ printf "%-10s%-10s%-10s%-10s%-10s
    "
    ,"",yuwen_sum,math_sum,enlish_sum,"" }

    awk 에서 getline 용법
    getline 은 두 파일 을 동시에 읽 고 작업 예 시 를 할 수 있 습 니 다.
  • file1
  • A 1
    B 2
    C 3
    
  • file2
  • A
    C
    
  • 스 크 립 트
  • BEGIN{
        while(getline<"file1"){a[$1]=$2}  # 将file1中加载到数组中
    }
    {
        if($1 in a) print $0  # 如果file2中的$1在数组a中 则打印
    }
    END{
    }
    

    좋은 웹페이지 즐겨찾기