셸 프로 그래 밍 (8): 텍스트 처리 삼 총사 awk
21385 단어 셸 프로 그래 밍
문법 서식
제1 종 형식
awk 'BEGIN{}pattern{commands}END{}' file_name
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
명령 행 매개 변수 배열
예시
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
두 번 째 모드 일치: 관계 연산 일치
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]}'
계산 가로 데이터 총합, 계산 세로 데이터 총합
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 은 두 파일 을 동시에 읽 고 작업 예 시 를 할 수 있 습 니 다.
A 1
B 2
C 3
A
C
BEGIN{
while(getline<"file1"){a[$1]=$2} # 将file1中加载到数组中
}
{
if($1 in a) print $0 # 如果file2中的$1在数组a中 则打印
}
END{
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
셸 언어 인 코딩 규범 (주석)규범 적 고려: 안전 한 각도, 성능 의 각도, 코드 의 가 독성 하나. 정식 을 시작 하 다 (1) 주석 1) 환수 2) 일반 주석 3) 스 크 립 트 의 머리 주석...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.