-15 명령 셸 항목 연구 노트 설명 : 세 총사 중 하나는 내장 awk- 기능 및 사용자 정의 함수

면책 조항 :이 문서는 블로거 hanchao5272 원저이며, 소스를 표시하고 원래의 링크 주소를 남겨주세요, 감사합니다! https://blog.csdn.net/hanchao5272/article/details/89205819

: 시리즈 카탈로그는 포털 참고 입문 연구 노트 쉘 - 프롤로그

AWK 내장 함수

기능 기술
int(expr) 정수로 잘린다
sqrt(expr) 제곱근
rand() 난수 반환 N, 01범위,0<N<1
srand([expr]) 지정되지 않은 경우 expr이, 난수를 생성하는 데 사용, 기본 씨앗 현재 시간은
이전 난수 시드를 사용하는 경우 생성
asort(a,b) 배열의 값이 정렬 된 새로운 배열에 저장된 값을 정렬 b하는
새로운 배열 첨자은 정렬 1시작
asorti(a,b) 어레이의 첨자는 정렬 문헌
sub(r,s[,t]) 입력 기록함으로써 s선택적으로 r, t스트링의 필드의 선택적 교체 만 교체
gsub(r,s[,t]) 입력 기록하여 s다른 방법으로 r, t필드의 선택적 교체, 모든 대체
match(str, regex) 테스트 문자열이 str일치 포함 regex문자열을
index(str,sub) 문자열 str을 인덱스 서브가 반환 0더를이 있음
length(str) length(arr) STR의 길이는 반환 배열 편곡의 사이즈를 돌려줍니다
split(str, arr,regex) 세퍼레이터 regex한다 str배열로 분할arr
substr(s,i[,n]) 문자열 촬영 s에서 i길이에 시작 n하는 경우, n지정되지 않은 나머지 부분을
tolower(str) str모든 대문자를 소문자로 변환
toupper(str) str모든 소문자가 대문자로
systime() 초 현재 시간
mktime() 시간 (초)로 포맷 시간을 변환
strftime([format[,timestamp[,utc-flag]]]) 포맷 출력 시간, 문자열에 타임 스탬프

INT (VAR)를 잘라 내기

admindeMacBook-Pro:myshell admin$ echo "111 11.1 11a 11a1" |awk '{for(i=1;i<=NF;i++) print $i}'
111
11.1
11a
11a1
admindeMacBook-Pro:myshell admin$ echo "111 11.1 11a 11a1" |awk '{for(i=1;i<=NF;i++) print int($i)}'
111
11
11
11
admindeMacBook-Pro:myshell admin$ echo "111 11.1 11a 11a1" |awk '{for(i=1;i<=NF;i++) print +$i}'
111
11.1
11
11
  • int(var)가로 챌 수있는 var첫 번째 등장整数
  • int(var)그것은 차단의 정수이고,이되어야 +var구별.

제곱근 SQRT (EXPR)

admindeMacBook-Pro:myshell admin$ awk 'BEGIN{print sqrt(9)}'
3

난수 랜드 () 및부터 srand ()

rand()생성 된 값이 상기 범위에 고정되어 (0)

admindeMacBook-Pro:~ admin$ awk 'BEGIN{print rand()};'
0.840188
admindeMacBook-Pro:~ admin$ awk 'BEGIN{print rand()};'
0.840188
admindeMacBook-Pro:~ admin$ awk 'BEGIN{print rand();print rand()}'
0.840188
0.394383
admindeMacBook-Pro:~ admin$ awk 'BEGIN{print rand()};'
0.840188

rand()필요 srand(), 수 있습니다 생성 전송하는 값의 변화를 만들기 위해 결합 srand()임의의 씨앗 방법이 변경으로의 생각을 :

admindeMacBook-Pro:~ admin$ awk 'BEGIN{srand();print rand()};'
0.424539
admindeMacBook-Pro:~ admin$ awk 'BEGIN{srand();print rand()};'
0.780827

으로 rand()하는 생성 1~100덜 임의의 숫자를 :

admindeMacBook-Pro:~ admin$ awk 'BEGIN{srand();print int(rand()*100)};'
63
admindeMacBook-Pro:~ admin$ awk 'BEGIN{srand();print int(rand()*100)};'
49

정렬 정렬 표준 배열 값에 따라 asort (a, b) 및 하부 어레이 asorti (a, b)

数组值排序asort(a,b)和数组下标排序asorti(a,b)어레이는 B로 정렬 된 후 숫자가 배열된다.

# 原始数组
admindeMacBook-Pro:~ admin$ echo 0 |awk 'BEGIN{a[1]="line11";a[3]="line09";a[4]="line12";a[8]="line10"}{for(v in a) print "a["v"]="a[v]}'
a[4]=line12
a[8]=line10
a[1]=line11
a[3]=line09
# asort按照值排序
admindeMacBook-Pro:~ admin$ echo 0 |awk 'BEGIN{a[1]="line11";a[3]="line09";a[4]="line12";a[8]="line10"}{N=asort(a,b);for(j=1;j<=N;j++) print "b["j"]="b[j]}'
b[1]=line09
b[2]=line10
b[3]=line11
b[4]=line12
# asorti按照下标排序
admindeMacBook-Pro:~ admin$ echo 0 |awk 'BEGIN{a[1]="line11";a[3]="line09";a[4]="line12";a[8]="line10"}{N=asorti(a,b);for(j=1;j<=N;j++) print "b["j"]="b[j]}'
b[1]=1
b[2]=3
b[3]=4
b[4]=8
  • asort하기 위해 배열로 결과를 정렬 b, 배열 인덱스는 원본을 포기합니다.
  • asorti하기 위해 下标배열로 결과를 정렬 b, 배열은 원래 값을 포기.

대안 적으로 서브 필드 (R, S [t]) 및 글로벌 필드 교체 GSUB (R, S [t])

admindeMacBook-Pro:~ admin$ printf "1 2 3 2 5\n2 5 3 2 1\n1 3 2 1 2\n"
1 2 3 2 5
2 5 3 2 1
1 3 2 1 2
# 替换首个匹配的字段 且 不指定字段
admindeMacBook-Pro:~ admin$ printf "1 2 3 2 5\n2 5 3 2 1\n1 3 2 1 2\n" |awk '{sub(2,0);print $0}'
1 0 3 2 5
0 5 3 2 1
1 3 0 1 2
# 替换全部匹配的字段 且 不指定字段
admindeMacBook-Pro:~ admin$ printf "1 2 3 2 5\n2 5 3 2 1\n1 3 2 1 2\n" |awk '{gsub(2,0);print $0}'
1 0 3 0 5
0 5 3 0 1
1 3 0 1 0
# 替换首个匹配的字段 且 指定字段
admindeMacBook-Pro:~ admin$ printf "1 2 3 2 5\n2 5 3 2 1\n1 3 2 1 2\n" |awk '{sub(2,0,$2);print $0}'
1 0 3 2 5
2 5 3 2 1
1 3 2 1 2
# 替换全部匹配的字段 且 指定字段
admindeMacBook-Pro:~ admin$ printf "1 2 3 2 5\n2 5 3 2 1\n1 3 2 1 2\n" |awk '{gsub(2,0,$2);print $0}'
1 0 3 2 5
2 5 3 2 1
1 3 2 1 2
  • sub(r,s)각 행은 첫 번째 매칭 필드 교체.
  • gsub(r,s)각 행의 모든 ​​일치하는 레코드 필드 교체.
  • sub(r,s)sub(r,s,t)차이점은 후자는 특정 필드와 일치하려고한다는 것입니다.

정규 경기 경기 (STR, 정규식)

# 存在
admindeMacBook-Pro:~ admin$ awk 'BEGIN{print match("abc123","123")}'
4
# 不存在
admindeMacBook-Pro:~ admin$ awk 'BEGIN{print match("abc123","321")}'
0

문자열 색인 지수 (STR, 하위)

# 单个字符的索引
admindeMacBook-Pro:~ admin$ awk 'BEGIN{print index("hello","h")}'
1
admindeMacBook-Pro:~ admin$ awk 'BEGIN{print index("hello","e")}'
2
# 连续字符的索引
admindeMacBook-Pro:~ admin$ awk 'BEGIN{print index("hello","he")}'
1
admindeMacBook-Pro:~ admin$ awk 'BEGIN{print index("hello","el")}'
2
# 首个匹配的字符
admindeMacBook-Pro:~ admin$ awk 'BEGIN{print index("hello","l")}'
3
# 不存在时,结果为0
admindeMacBook-Pro:~ admin$ awk 'BEGIN{print index("hello","k")}'
0
  • 시작 인덱스 위치 1에서 0이 없음을 나타냅니다.
  • 복수의 일치가 존재하면, 결과는 첫 번째 일치하는 인덱스를 나타낸다.

문자열 길이의 길이 ([S])

admindeMacBook-Pro:~ admin$ awk 'BEGIN{a="1111";print length(a)}'
4
admindeMacBook-Pro:~ admin$ awk 'BEGIN{a[1]="1111";a[3]="2222";print length(a)}'
2
  • length(var): VAR의 길이
  • length(arr): 배열의 크기 도착

분할 분할 (캐릭터, 편곡, 정규식)

admindeMacBook-Pro:~ admin$ awk 'BEGIN{str="10.20.30.40";split(str,arr,".");for(v in arr) print arr[v]}'
40
10
20
30
admindeMacBook-Pro:~ admin$ awk 'BEGIN{str="10.20.30.40";split(str,arr);for(v in arr) print arr[v]}'
10.20.30.40
admindeMacBook-Pro:~ admin$ awk 'BEGIN{str="10 20 30 40";split(str,arr);for(v in arr) print arr[v]}'
40
10
20
30
admindeMacBook-Pro:~ admin$ awk 'BEGIN{FS=".";str="10.20.30.40";split(str,arr);for(v in arr) print arr[v]}'
40
10
20
30
  • 더 구분이 경우 regex분리 문자 FS로 사용되지 않습니다.

차단 문자열 SUBSTR (S, I [N])

admindeMacBook-Pro:~ admin$ awk 'BEGIN{str="123haha";print substr(str,3)}'
3haha
admindeMacBook-Pro:~ admin$ awk 'BEGIN{str="123haha";print substr(str,3,2)}'
3h
  • substr(s,i):이 끝날 때까지, 모든 I부터 문자열의 가로 채기.
  • substr(s,i,n)모든 시작, 문자열의 가로 채기 난, 절편 길이는 N이다.

케이스 변환 tolower를 (들)과의 ToUpper (들)

admindeMacBook-Pro:~ admin$ awk 'BEGIN{s="Hello World";print s;print tolower(s);print toupper(s)}'
Hello World
hello world
HELLO WORLD

시스템 시간 SYSTIME, mktime은과의 strftime

저자 systime초 취득 시스템 :

admindeMacBook-Pro:~ admin$ awk 'BEGIN{print systime()}'
1551088337

으로 systime("date")시스템 날짜를 획득 :

admindeMacBook-Pro:~ admin$ awk 'BEGIN{system("date");}'
2019年 02月 25日 星期一 17:55:39 CST

으로 초 날짜 형식 변환의 시간 :mktime(dataspec)"YYYY MM DD HH MM SS"

admindeMacBook-Pro:~ admin$ awk 'BEGIN{print systime()}'
1551088808
admindeMacBook-Pro:~ admin$ awk 'BEGIN{print mktime("2019 02 25 17 57 30")}'
1551088650

저자 strftime([format [, timestamp[, utc-flag]]])시간 (초) 출력 형식 :

admindeMacBook-Pro:~ admin$ awk 'BEGIN{print strftime("%Y-%m-%d %H:%M:%S",systime())}'
2019-02-25 18:03:00
admindeMacBook-Pro:~ admin$ awk 'BEGIN{print strftime("%Y-%m-%d %H:%M:%S",mktime("2019 02 25 17 57 30"))}'
2019-02-25 17:57:30

여기되는 strftime형식 문자를 사용할 수 있습니다 :

SN 기술
%에이 약어 주 (월 - 일).
%에이 주 전체 이름 (월 - 일).
%비 월의 약어 (월).
%비 달의 전체 이름 (년 1 월).
%기음 현지 날짜 및 시간입니다.
%기음 연간 세기 부가 된 연도가 100로 나누어.
%디 진수 날짜 (01-31)
%디 %의 m / %의 D / Y %에 상당.
%이자형 만있는 경우 날짜는 1 개 자리는 공백으로 채워집니다
%에프 당량 % Y- % M- % D는 ISO 8601 표준 데이터 형식이다.
%지 해 ISO8610 표준 주변 금형 (100) 여기서 또한 (00-99). 예를 들어 1 월 1 일 1993 년 1992 년의 첫 번째 53주에 속한다. 는 1 일, 1993 년에했지만, 그 ISO8601 기준 연도 동안 그래서, 주 1992입니다. 마찬가지로, 12 월 (31)하지만, 1973 년 1,973에 속하는하지만 1994 년 첫 주에 속한다. 그래서 ISO8610 주 1973년 12월 31일의 기준은 어디에서 1974 대신 1973입니다.
%지 올해의 전체 이름은 ISO 표준 주.
%의 시간 당량 % 나.
% H 진수 표현과 함께 시간 24 시간 형식 (00-23)
%나는 12 시간 형식 진수 표현과 시간 (00-12)
% j를 올해의 처음 몇 일 (001-336)
%엠 달 (01-12)
%엠 시간 (분) (00-59)
%엔 줄 바꿈 (ASCII의 LF)
%피 십이 진법 표기 (AM / PM)
%아르 자형 방법 십이 진법 시간 나타낸다 (I %에 상당하는 %의 M을 %의 S %의 피).
%아르 자형 그것은 %의 H에 상당 % M.
%에스 두번째 값 (00-60)
%티 탭 (TAB)
%티 % M : 그것은 %의 H에 상당 % S.
%에서 주 월요일 (1-7) 디지털 표현, 1.
% U 올해의 처음 몇 주 (첫 주를 시작으로 첫 번째 일요일), 00-53
%의 V 올해의 처음 몇 주 (첫 번째 월요일 시작 첫 주 등), 01-53.
%의 w 디지털 표현에 주 (0-6), 0은 일요일을 나타냅니다.
% W 처음 몇 주간의 진수 표현 년 (시작의 첫 주와 같은 첫 번째 월요일), 00-53.
%엑스 현지 날짜 표현
%엑스 현지 시간
%와 올해 모드 (100).
% Y 전체 년의 진수 표현입니다.
의 % 포맷 + HHMM 표현 시간대 (예를 들어, 형식 요구 RFC 1036 RFC 822 헤더 생성 시간)
%에서 시간대 이름 또는 약어, 시간 영역은 출력을 보류하지 않는 경우.

AWK 사용자 정의 기능

문법

function function_name(param1,param2,...)
{
  body
}

[worker@c2-a02-126-10-4 hanchao]$ cat func.awk
# sum
function sum(a,b)
{
   return a + b;
}

# avg
function avg(a,b)
{
   return (a + b) / 2;
}

# main
function main(a,b)
{
   print "sum=",sum(a,b);
   print "avg=",avg(a,b);
}

BEGIN{
   main(10,20)
}
[worker@c2-a02-126-10-4 hanchao]$ awk -f func.awk
sum= 30
avg= 15

추천

출처blog.csdn.net/hanchao5272/article/details/89205819