RE 정규 표현식과 그렙, AWK와 sed 도구 자세한 사용법

1. 어떤 정규 표현식이다

인기,이 방법은 정규 표현식 문자열을 처리하는 것입니다, 그는, 특수 기호의 숫자에 의해 지원 행동 문자열, 정규 표현식의 단위로 취급하는 사용자가 쉽게 "달성 / 삭제 / 검색 할 수 있습니다 대신 "특정 문자열 핸들러! 실질적으로 정규 표현 "발현"만큼 공구이 식을 지원하는 경우, 그 프로그램이 사용하는 정규 표현 처리 공구 문자열로 사용할 수있다. 그들은 정규 표현식을 지원해야하기 때문에이 과정 문자열에 정규 표현식에서 특수 문자를 사용할 수있는 이러한 도구 있도록 vi와 같은, 그렙, AWK, 훨씬 더 나오지도합니다. 그러나 등 CP, LS, 명령으로 만 와일드 카드를 사용할 수 있도록 단지 자체 배쉬, 정규 표현식을 지원하지.

2. RE 문자와 특수 기호

1. 특수 기호
특수 기호 대표자를 의미
[: 떠] Z A-Z - 모든 대소 문자와 숫자, 즉 0-9를 나타내는
[: 알파 :] 어떤 경우 영문자를 나타내고, 즉, A-Z의 A-Z
[:보다 낮은:] 주제 소문자 문자, 즉, A-Z
[:높은:] 영어 문자를 대문자, 즉 A-Z를 대신
[:숫자:] 그것은 숫자를 나타냅니다 0-9
[:공백:] Tab 키 또는 스페이스 바를 대신에
[: CNTRL :] 등 델 CR, LF, 탭, : 그것은 같은 키보드의 모든 키를 나타냅니다
[:그래프:] 다른 키와 스페이스 바를 Tab 키 대표에 추가
[:인쇄:] 그것은 다음과 같은 문장 부호를 나타냅니다 : '', 그리고 # $으로 이렇게!?
[:우주:] 등 스페이스 키, 탭, CR : 그것은 모든 문자와 같은 흰색 키를 생성 할 수 있습니다 나타냅니다
[: Xdigit] 포함하고, 16 비트의 디지털 입력에 주제 : 0-9, AF, AF 숫자 문자

注意:前五条是常用的,其它一般不怎么用或者能用其它方式代替

예 2. 특수 기호

우리는 일부 데이터의 예를 찾기 위해 인터넷에 접속

Hello! / Hi!
Good-bye, "Mike".
See you tomorrow.
It’s time for class.
Open your books and turn to page 20.
Could you say it again? 
Where’s the company? 
Which is the right size? 
Do you know where I’ve put my glasses? 
Is this your pen? I found it under the desk. 
Which is your bag? 
The one on your right. 
Are these books all yours? 
She must be a model, isn’t she? 
I really don’t known.
#I have no idea about it.
What’s your family name?
Rose, let me introduce my friend to you.
Nice to meet you, too.
toooooot 
What day is it today?
It’s January the 15th, 1999.
It’s the year of 1999.
However, this dress is about $ 3183 dollars.
我们将数据写入一个文件里面
[root@localhost tmp]# vim test.text

시작 일치

[root@localhost tmp]# grep "[:alnum:]" test.text         #我们不能直接使用这些特殊符号
grep: 字符类的语法是 [[:space:]],而非 [:space:]
[root@localhost tmp]# grep "[[:alnum:]]" test.text        #我们需要用[]将其括起来

그림 삽입 설명 여기

3.RE 문자 및 사용
RE 문자 의미 및 사용 예
^ 의미 : 행의 시작 부분이 일치하는
[root@localhost tmp]# grep -n '^#' test.text      #匹配到以#开头的行,并打印出行号
-n 参数表示显示行号

그림 삽입 설명 여기

RE 문자 의미 및 사용 예
$ 라인의 끝이 일치합니다 : 의미
[root@localhost tmp]# grep -n '!$' test.text      #匹配到以#开头的行,并打印出行号

그림 삽입 설명 여기

RE 문자 의미 및 사용 예
. 의미 : 임의의 문자를
[root@localhost tmp]# grep -n 'e.e' test.text      
#匹配到的字符串可以是(ere)(eve),就是两个e中间一定有且仅有一个其它字符,空字符也算。
#但不能是(ee) 如:See you tomorrow.  See虽然有两个e,但是不符合就没有出现

그림 삽입 설명 여기

RE 문자 의미 및 사용 예
\ 의미 : 이스케이프 문자, 특수 기호의 특별한 의미를 제거
[root@localhost tmp]# grep -n '\$' test.text     
#    $   本来是匹配结尾的但是这里转义就能匹配到

그림 삽입 설명 여기

RE 문자 의미 및 사용 예
* 의미 : 캐릭터가 무한대 시간으로 전년 제로를 반복합니다
[root@localhost tmp]# grep -n 'to*' test.text   
#  匹配到单个t(零次o) 匹配到too (多次o)  

그림 삽입 설명 여기

RE 문자 의미 및 사용 예
[] 의미 : [] 내부에 매칭되는 문자를 나타내는
[root@localhost tmp]# grep -n 'o[nmt]' test.text  
# [nmt]代表n或m或t 所以会匹配到(on)(om)(ot)  

그림 삽입 설명 여기

[root@localhost tmp]# grep -n '[0-9]' test.text  
#[0-9]就相当于[0123456789]   

그림 삽입 설명 여기

RE 문자 의미 및 사용 예
[^] 의미 : 내부를 제외하고 문자를 일치하는 것을
[root@localhost tmp]# grep -n 'on[^e]' test.text 
#[^e] 表示除了e之外其它字符都可以即匹配不到one
#空字符也算

그림 삽입 설명 여기

RE 문자 의미 및 사용 예
{N, m} 의미 : 문자를 m으로 반복 N 시간 전에
[root@localhost tmp]# grep -n 'to\{1,3\}' test.text 
#重复o 一到三次
#要跟* 区分 *表示重复零次到无穷多次

그림 삽입 설명 여기
그림 삽입 설명 여기

3.grep

매개 변수의 정규 믹스의 일부 1.grep 이야기
-A   n  	把匹配成功行之后的n行也同时列出。 A 就是 after 的首字母就是之后的意思
-B   n  	把匹配成功行之前的n行也同时列出。B 就是 before 的首字母就是之前的意思
-C  n  	把匹配成功行的前后n行也同时列出。
-o   		只显示匹配到的字符
-c   		统计数量    (一般是跟其它参数一起用)
-n   		显示行号     (前面说过了)
-l			只要文件名   
2.gerp 일반 확장

확장 정규 필수의 egrep을 가진 또는 그렙 -E

RE 문자 의미 및 사용 예
+ 의미 : 이전의 문자가 한 번 반복하거나 한 번 이상있다
? 의미 : 이전의 문자를 0 또는 1 반복
| 의미 : 대표 또는
() 의미 : 그룹 문자열
() + 의미 : 문자열의 그룹이 한 번 이상을 반복하기 전에
这里面+  和 ?  我就不多说了,注意要比较和* 的区别
而 |  的用法也特别简单比如:
 [root@localhost tmp]# echo "tooooabsdsadooo"  | grep -E 'too|ab'     #表示匹配too或者ab
tooooabsdsadooo             #too  和 ab  将被标红
[root@localhost tmp]# echo "goodaaaglad"  | grep -E 'g(oo|la)d'          #表示匹配到good或者glad
goodaaaglad                  #good和glad将被标红
[root@localhost tmp]# echo "goodgabcabcabcglad"  | grep -E 'g(abc)+g'  #是匹配到gabcabcabcg
goodgabcabcabcglad        #找的是以g开头g结尾,中间是一个以上的abc

쓰기는 날짜 형식 YYYY-MM-DD 정규 표현식과 일치 (소화하기)

[root@localhost tmp ~]# echo "2019-12-30" |grep -E '[1-9][0-9]{3}-((0[1-9])|(1[0-2]))-((0[1-9])|([12][0-9])|(3[01]))'
2019-12-30
[root@localhost tmp ~]# echo "1919-12-30" |grep -E '[1-9][0-9]{3}-((0[1-9])|(1[0-2]))-((0[1-9])|([12][0-9])|(3[01]))'
1919-12-30

정기 높은 수준의 구성 요소 : 탐욕이 | 비 욕심 (이해처럼)
탐욕은, 가능한 한 많은 일치하는
매칭이 가능한 한 적은 비 욕심 만 다시 플러스 일부 표현 정량 (시대의 수입니다) ?같은 : .*? +?
GREP 또는 egrep을 기본값 욕심 아닌 욕심 모드를 지원하지 않습니다.
펄 언어 환경의 정기를 사용하여 비 욕심 -P 매개 변수를 사용할 필요가 실현하려면그림 삽입 설명 여기

4.awk

1.awk 프로필

AWK 방식으로 텍스트 및 데이터 처리는 프로그레시브 스캔 마지막 행의 첫 번째 행에서 파일, 특정 패턴과 일치하는 줄을 찾습니다, 당신은이 라인에 할 것인지 등이다. 연산 처리를 지정하지 않으면, 일치하는 선이, 화면에 어떠한 모드가 지정되지 않으면, 모든 행이 지정된 동작 과정을 표시 넣어.

2.awk 사용

AWK [옵션] '명령'파일 이름이의
awk가 [옵션] -f - AWK-스크립트 파일 이름의 파일이 스크립트 파일 명령에서 읽을 수 -f 수단 awk가
옵션 :
-F각 치료의 내용, 하위 정의 구분 기호를 지정할 수 있습니다, 기본 구분자는 공백 문자 (공백 또는 탭)입니다
명령 :

BEGIN{}            	处理匹配到内容之前的动作
{}             				处理匹配到内容之中的动作
END{}            		处理匹配到内容之中的动作
3. 작품

(1)awk是一行一行处理的,每次处理时,使用一行作为输入,并将这一行赋给内部变量$0,以换行符结束
(2)每行会被分隔符分成多个字段,每个字段存储在已编号的变量中,从$1开始,最多达100个字段
(3)初始时,FS赋为空白字符,所以默认为以空格为分隔符
(4)awk打印字段时,将以内置的方法使用 print 函数打印,awk 在打印出的字段间加上空格。这个空格是内部的一个变量 OFS 输出字段的分隔符, 逗号 , 会和 OFS 进行映射,通过 OFS 可以控制这个输出分隔符的值。
(5)awk输出之后,将从文件中获取另一行,并将其存储在$0中,覆盖原来的内容,然后将新的字符串分隔成字段并进行处理。该过程将持续到所有行处理完毕

4.与字段有关的内部变量
$0 : awk变量 $0 保存当前正在处理的行内容
NR : 当前正在处理的行是 awk 总共处理的行号。
FNR: 当前正在处理的行在其文件中的行号。
NF :每行被处理时的总字段数
$NF: 当前处理行的分隔后的最后一个字段的值
FS : 字段分隔符,默认空格
OFS : 输出字段分隔符,默认是一个 空格
ORS 输出记录分隔符, 默认是换行符.
[root@localhost tmp ~]# awk 'BEGIN{FS=":"} {print $NF}' /etc/passwd     #以:(冒号)为分隔符,输出每一行的最后一个字段的值
[root@localhost tmp]# awk 'BEGIN{FS=":"; OFS="+++"} /^root/{print $1,$2,$3,$4}' /etc/passwd
root+++x+++0+++0                  #输出时以+++隔开
[root@localhost tmp]# awk 'BEGIN{ORS="  "} {print $0}' /etc/passwd #将文件的所有行合并为一行
5.awk模式和动作

awk语句是由模式和动作组成的
模式可以是正则表达式,比较表达式等,而动作一般都是打印print
1.正则表达式:

awk '/正则表达式/'     filename      整行匹配   /正则表达式/  或 !/正则表达式/ 或 $0 ~ /正则表达式/
awk '字段 ~ /正则表达式/'     filename      某一字段匹配 字段 ~ /正则表达式/ 或 字段 !~ /正则表达式/
[root@localhost tmp]# awk -F: '/alice/' /etc/passwd      #只要有anlice就行
[root@localhost tmp]# awk -F: '$NF !~ /alice/' /etc/passwd      #最后一个字段不是anlice

2.比较表达式

== 等于 
!= 不等于                      
< 小于 
> 大于
<= 小于 
>= 大于等于

== 等于 != 不等于 两边可以是数字也可以是字符串

[root@localhost tmp]# awk -F: '$NF == "alice" ' /etc/passwd      #最后一个字段是anlice (别忘了字符串要引起来)
[root@localhost tmp]# awk -F: '$3== 0' /etc/passwd      #第三个字段是0
[root@localhost tmp]# awk -F: '$3 > 0 ' /etc/passwd      #第三个字段大于0

3.条件表达式:if if else
4.逻辑表达式:
&& 与 同时满足
|| 或 满足其中一个
! 非 取反
5.范围模式
起始表达式, 终止表达式

[root@localhost tmp]# awk -F: '/^bin/,/adm/ {print $0 }' /etc/passwd
#从开头是 bin 的行开始匹配成功一直到含有 adm 的行结束匹配(中间的行也都打印出来)

6.外部变量的引用
一般是用awk -v 参数

[root@localhost tmp]# test=hello
[root@localhost tmp]# echo "hello world" | awk -v var=$test '$1 == var {print $1}'
hello

5.sed

라인에 의해 처리 된 모든 행이 같은 AWK로 동작 모드를 나오지
정규 확장 지원 정규식을 지원 나오지도 있지만, 보통 사용 확장에 -r 매개 변수를 사용한다. 그래서 실제 사용 일반적으로 -r 스위치에서, 당신은 정기적으로도 오류 확장 사용하지 않는 경우에도 마찬가지입니다.
각 행은 관계없이 다시 한 번 출력에 일치 할 경우이 라인의 내용, 패턴과 일치하는지 여부, 기본 출력 파일을 나오지. 사용은 기본 출력 매개 변수 -n 차폐
출력 변화가 있지만, 사실은 어떤 문서 변화가없는 경우에만이 매개 변수를 추가하지 마십시오, 파일 내부의 내용을 변경하는 -i 매개 변수를

1. 대부분 ---- 실제 교체를 사용하여 검색
# 搜索每一行,找到有 root 的,把第一个替换为yjssjm
sed  -rn  's/root/yjssjm/'   filename
# 搜索每一行,找到所有的 root 字符,进行全局替换为 yjssjm
sed  -rn  's/root/yjssjm/g'   filename     
# i  是同时忽略大小写
sed  -rn  's/root/yjssjm/gi'    filename #也就是可以将Root ROot 等替换成yjssjm
# 找到含有 root 的进行删除
sed  -rn  '/root/d'   filename
# 可以使用不同的 字符 作为界定符号,注意进行转义
sed  -rn  '\#root#d'  filename
# 第 1 行到第 3 行都删除
sed  -r  '1,3  d'    filename
2.sed 일반적으로 사용되는 명령

S : 명령을 교체하십시오

# 将所有的两位数字后面加.5
[root@localhost tmp]# echo "77      1"|sed -r 's/[0-9][0-9]/&.5/'
77.5      1
#/()/\1/  注意格式
[root@localhost tmp]# echo "nowrite" | sed -r 's/(no)write/\1写/'
no写

2. 추가] 명령 : (나중에 광고 매칭 첨가)

[root@localhost tmp]# echo "aaaaaaa" | sed -r 'a\111111111'
aaaaaaa
111111111

3. 명령 : I (매치 라인 앞에 삽입)

[root@localhost tmp]# echo "aaaaaaa" | sed -r 'i\111111111'
111111111
aaaaaaa

4. 수정 명령 : C

[root@localhost tmp]# echo "aaaaaaa" | sed -r 'c\111111111'
111111111
3. 다양한 편집 옵션 : -e
sed -re '1,3 d' -re 's/root/yjssjm/' filename
等同于
sed -r '1,3 d; s/root/yjssjm/' filename
或者多行命令
sed -r '1,3 d' filename
sed -r 's/root/yjssjm/'dfilename
4. 일반 운영

파일의 사용 : 세트리스트는 일부 특수 기호가 표시되지 않습니다 볼 수있을 것
같은 : $는 빈 줄의 시작을 나타냅니다, $의 끝에 캐리지 리턴을 나타냅니다

删除配置文件中被注释的行
sed -ri '/^#/d' filename
删除配置文件中空行
sed -ri '/^$/d' filename
删除开头的一个或者多个空格或者Tab键
sed -ri '/^[ \t]*#/d' filename
给文件3到7行添加注释
sed -r '3,7s/^/#/' filename
게시 31 개 원래 기사 · 원 찬양 91 ·은 10000 +를 볼

추천

출처blog.csdn.net/baidu_38803985/article/details/105023004