Shell编程1

本文介绍正则表达式的概念及其在grep、awk、sed等命令中的应用,涵盖基础正则表达式、字符截取命令、printf命令、awk与sed命令详解及字符处理命令等内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.1 基础正则表达式

1.1.1 正则表达式与通配符

正则表达式用来在文件中匹配符合条件的字符串,正则是包含匹配

grep  awk  sed 等命令可以支持正则表达式

grep  (global search regular expression and print out the line)  提取行

包含匹配字符串

 

通配符用来匹配符合条件的文件名,通配符是完全匹配

ls  find  cp 这些命令不支持正则表达式,所以只能使用Shell自己的通配符来进行匹配了

完全匹配文件名

 

anaconda-ks.cfg 安装信息


1.1.2 基础正则表达式

元字符  作用

*    前一个字符匹配0次或任意多次

.   匹配除了换行符外任意一个字符

^   匹配行首。例如:^hello会匹配以hello开头的行

$   匹配行尾。例如:hello$会匹配以hello结尾的行

[] 匹配中括号中指定的任意一个字符

[^] 匹配除中括号中字符以外的任意字符

\    转义字符  用于取消特殊符号的含义

\{n\} 表示其前面的字符恰好出现n次。


[0-9]\{4\} 匹配4位数字

[1][3-8][0-9]\{9\} 匹配手机号码


\{n,\}  表示其前面的字符出现不小于n次。

\{n,m\} 不小于n次,不大于m


1.1.3 字符截取命令

cut字段提取命令

cut 选项 文件名

    -f 列号:  提取第几列

    -d 分隔符:按照指定分隔符分割列  默认分隔符是制表符:Tab

vi student.txt

ID  Name  Gender  Mark

1   Zhang    M    86

2   Li    M    90

3   Wang    M    83

#中间不是空格,是Tab

 

cut -f 2 student.txt

cut -f 2,4 student.txt

cut -d ":" -f 1,3 /etc/passwd

cat /etc/passwd | grep /bin/bash | grep -v root | cut -d ":" -f 1

 

cut 命令的局限——对于空格分隔无能为力,需要用awk命令

df -h | cut -d " " -f 1,3


1.1.4 printf命令

printf '输出类型输出格式' 输出内容

 

输出类型:

  %ns    输出字符串。n是数字,指代输出几个字符

  %ni    输出整数。n是数字,指代输出几个数字

  %m.nf  输出浮点数。mn是数字,指代输出的总位数和小数位数

 

输出格式:

  \a    输出警告音

  \b    输出退格键Backspace

  \f    清除屏幕

  \n    换行

  \r    回车键Enter

  \t    水平输出退格键,也就是Tab

  \v    垂直输出退格键,也就是Tab

 

printf '%s %s %s\n' 1 2 3 4 5 6  #三个为一组,换行输出

printf '%s' $(cat student.txt)  #作为一个连续的整体输出:IDNAMEGENDER....

printf '%s\t %s\t %s\t %s\t\n' $(cat student.txt)  #同样格式输出

 

awk命令的输出中支持printprintf命令

 

print:会在每个输出之后自动加入一个换行符(Linux默认没有print命令)

printf:是标准格式输出命令,并不会自动加入换行符,如果需要换行,需要手工加入换行符

 

1.1.5 awk命令  

pattern scanning and processing language

截取列

分隔符默认是Tab 和 空格

 

awk ‘条件1{动作1}条件2{动作2}...’ 文件名

 

条件(Pattern

一般使用关系表达式作为条件

x> 11 判断变量x是否大于11

x>=11 大于等于

x<=11 小于等于

 

动作(Action

格式化输出

流程控制语句

 

vi student.txt

ID Name PHP Linux MySQL Average

1 Zhang 82 95      86     87.66

2 Li     74 96      87     85.66

3 Wang     99 83      93     91.66

awk '{printf $2 "\t" $6 "\n"}' student.txt

{}之间的是正则

$0代表整行

$1代表第一列

$2代表第二列


 

df -h | awk '{print $1 "\t" $5 "\t" $6}'

df -h | grep sda5 | awk '{print $5}' | cut -d "%" -f 1

 

 

BEGIN

awk 'BEGIN{print "test !!"} {print $2 "\t" $5}' student.txt

BEGIN 后的动作只执行一次

 

FS内置变量

用FS指定分隔符  

awk 'BEGIN{FS=":"}{print $1 "\t" $3}' /etc/passwd

cat /etc/passwd | grep "/bin/bash" | awk 'BEGIN {FS=":"}{printf $1 "\t" $3 "\n"}'

 

END

awk 'END{print "The End"}{printf $2 "\t" $6 "\n"}' student.txt

 

 

关系运算符

cat student.txt | grep -v Name | awk '$6 >= 87 {printf $2 "\n"}'

 

awk 是可以编程的

 

1.1.6 sed 命令

grep 行截取

cut awk 列截取

 

sed是一种几乎包括在所有UNIX平台(包括Linux)的轻量级流编辑器。

stream editor for filtering and transforming text

sed主要是用来将数据进行选取、替换、删除、新增的命令

用于操作命令的结果,实际应用于Shell脚本

 

sed 选项 '[动作]' 文件名

选项:

-n    一般sed命令会把所有数据都输出到屏幕,如果加入此选择,则只会把经过sed命令处理的行输出到屏幕

-e    允许对输入数据应用多条sed命令编辑

-i    sed的修改结果直接修改读取数据的文件,而不是由屏幕输出

 

动作:

a \ 追加,在当前行后添加一行或多行。

添加多行时,除最后一行外,每行末尾需要用\”代表数据未完结

 

c \ 行替换,用c后面的字符串替代原数据行,替换多行时,除最后一行外,

每行末尾需用\”代表数据未完结

 

i \ 插入,在当前行前插入一行或多行。

插入多行时,除最后一行外,每行末尾需要用\”代表数据未完结

 

d 删除,删除指定的行

p 打印,输出指定的行

s 字串替换,用一个字符串替换另外一个字符串。格式为“行范围s/旧字串/新字串/g

vim中的替换格式类似

 

sed '2p' student.txt

#查看文件的第二行,文件全部显示,第二行出现两次

 

sed -n '2p' student.txt

#只出现第二行

 

df -h | sed -n '2p'

 

sed '2,4d' student.txt

#删除第二行到第四行的数据,但不修改文件本身

 

sed '2a hello' student.txt

#在第二行后追加hello

 

sed 2i hello \   worldstudent.txt

#在第二行前插入两行数据

 

sed '2c No such person' student

#数据替换

 

字符串替换

sed 's/旧字串/新字串/g' 文件名

 

sed '3s/74/99/g' student.txt

#在第三行中,把74换成99

 

sed -i '3s/74/99/g' student.txt

#sed操作的数据直接写入文件

 

sed -e 's/Zhang//g;s/Wang//g' student.txt

#同时把“Zhang”和“Wang”替换为空

尽量不用i,如需修改文件,用vim编辑器


1.1.7 字符处理命令  

排序命令 sort

sort 选项 文件名  可以接受管道符

-f 忽略大小写

-n 数值型排序,默认以字符串型排序

-r 反向排序

-t 指定分隔符,默认为制表符

-k n,m 指定从n字段到m字段进行排序

 

sort /etc/passwd

sort -r /etc/passwd

sort -t ":" -k 3,3 /etc/passwd UID排序

sort -n -t ":" -k 3,3 /etc/passwd


统计命令wc

wc 选项 文件名  可以接受管道符

-l 行数

-w 单词数

-m 字符数






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值