Linux、Shell入门2-Shell语法入门


前言

这个部分想写一下基本的Shell语法的使用和入门,这个部分也一直在拖延,今天决定开始啦。


一、mkdir

语法:

mkdir [-p] dirName

-p 确保目录名称存在,不存在的就建一个。

二、>/dev/null

/dev/null 是一个特殊的设备文件,它丢弃一切写入其中的数据,>/dev/null 丢弃前面命令的输入数据,2>/dev/null丢弃报错信息。
比如:

source ~/.cshrc

会有如下的报错输出:
-bash: /data/home/name
/.cshrc: line 14: syntax error: unexpected end of file
但运行:

source ~/.cshrc 2>/dev/null

就不会有任何的输出信息。

三、基础正则表达式

1.语系对正则表达式的影响

[:alnum:]所有字母和数字
[:alpha:]所有字母
[:upper:]大写字母
[:lower:]小写字母
[:digit:]数字

2.grep的一些高级选项

基本的grep语句是这样的:

grep -A -B '查找的字符' filename

-A是打印查找内容后几行,如-A2就是打印后两行,记住的话A是after的意思;
-B是打印查找内容前几行,如-B3就是打印前三行,B是before的意思。
注意grep找出的是包含查找内容一整行的内容。

3.基础正则表达式练习

例题1:查找特定字符串

查找test_linux.txt文件中含the的行,用-n:

grep -n 'the' test_linux.txt

反选是-vn

grep -vn 'the' test_linux.txt

不分大小写地查找,包括找The,用-in

grep -in 'the' test_linux.txt

例题2:利用中括号[]来查找集合字符串

查找test_linux.txt文件中含test或tast的行:

grep -n 't[ae]st' test_linux.txt

查找含he但不含the的行:

grep -n '[^t]he' test_linux.txt

查找含有he,但he前面不能是小写字母的行:

grep -n '[^[:lower:]]he' test_linux.txt

查找含有数字的行:

grep -n '[[:digit:]]' test_linux.txt

例题3:行首行尾符^$

查找test_linux.txt文件中以The开头的行:

grep -n '^The' test_linux.txt

查找以大写字母开头的行:

grep -n '^[A-Z]' test_linux.txt

和上一步实现同样功能:

grep -n '^[[:upper:]]' test_linux.txt

这里需要注意^在[]外表示以开头,在[]内则表示非。
查找以.结尾的行:

grep -n '\.$' test_linux.txt

注意\表示转义,对有特殊含义的字符当作普通字符进行操作。
查找空行:

grep -n '^$' test_linux.txt

例题4:任意一个字符.和重复字符*

查找test_linux.txt文件中含t任意字符e的行:

grep -n 't.e' test_linux.txt

查找含有至少两个e的行:

grep -n 'eee*' test_linux.txt

查找t e之间含有任意字符的行:

grep -n 't.*e' test_linux.txt

查找至少含有一个数字的行:

grep -n '[0-9][0-9]*' test_linux.txt

例题5:限定连续RE字符范围{}

查找test_linux.txt文件中含两个e的行:

grep -n 'e\{2\}' test_linux.txt

查找含2-5个e的行:

grep -n 'e\{2,5\}' test_linux.txt

查找含两个以上e的行:

grep -n 'e\{2,\}' test_linux.txt

4.基础正则表达式字符集合

^word 行首
word$ 行尾
. 任意一个字符
\ 转义
* 重复0-无穷
[list] 字符集合
[n1-n2] 字符范围
[^list] 不出现字符集合
{n,m} 出现次数的限定

5.sed工具

sed的基本语句:

sed [-nefr]

参数-n安静模式,-e命令行编辑,-f执行文件里的sed操作,-r扩展正则表达式,-i修改读取文件内容。
功能a新增,c替换(替换行),d删除,i插入,p打印,s替换(替换正则表达式)。
删除2-5行:

ll | sed '2,5d'

在第2行后增加:

ll | sed '2a drink tea'

在第2行后增加两行:

ll | sed '2a Drink tea or ......\
> drink beer?'

将2-5行的内容替换为no 2-5 number:

ll | sed '2,5c no 2-5 number'

打印5-7行的内容:

ll | sed -n '5,7p'

类似于vi里的替换:

sed 's/要被替换的字符/新的字符/g'

对于文件内容的操作是sed -i:

sed -i 's/\.$/\!/g' test_linux.txt

以上的操作是将以.结尾的部分替换成!

sed -i '$a # This is a test' test_linux.txt

以上操作将在test_linux.txt文件的结尾加上 # This is a test

四、扩展正则表达式

+ 一个或一个以上
?0个或1个
| 或
() 群组
()+ 多个重复群组

五、文件的格式化与相关处理

1.格式化打印:printf

printf的基本语句:

printf '打印格式' 实际内容

vi 一个 printf.txt 文件,输入内容:
Name Chinese English Math Average
DmTsai 80 60 92 77.33
VBird 75 55 80 70.00
Ken 60 90 70 73.33

printf '%s\t %s\t %s\t %s\t %s\t \n' $(cat printf.txt)

输出为:
DmTsai 80 60 92 77.33
VBird 75 55 80 70.00
Ken 60 90 70 73.33

printf '%10s %5i %5i %5i %8.2f \n' $(cat printf.txt | grep -v Name)

输出为:

DmTsai    80    60    92    77.33 
 VBird    75    55    80    70.00 
   Ken    60    90    70    73.33
printf '\x45\n'

输出为:E

2.awk:好用的数据处理工具

awk的基本语句:

awk '条件类型1{操作1} 条件类型2{操作2} ...' filename
last -n 5

输出为:
name1 pts/19 10.24.3.45 Wed Mar 1 10:00 still logged in
name2 pts/18 10.24.3.133 Wed Mar 1 09:52 still logged in
name3 pts/17 10.24.3.22 Wed Mar 1 09:45 still logged in
name4 pts/2 10.24.3.22 Wed Mar 1 09:35 still logged in
name5 pts/8 10.24.3.29 Wed Mar 1 09:25 still logged in

wtmp begins Wed Feb 8 03:53:34 2023

last -n 5 | awk '{print $1 "\t" $3}'

这是为了打印以\t分隔的第一列和第三列,
输出为:
name1 10.24.3.45
name2 10.24.3.133
name3 10.24.3.22
name4 10.24.3.22
name5 10.24.3.29

wtmp Wed

last -n 5 | awk '{print $1 "\t lines:" NR "\t columns:" NF}'

NR是目前awk处理的第几行数据,NF是每一行(S0)拥有的字段总数,FS是目前的分隔字符,默认是空格。
输出为:
name1 lines:1 columns:10
name2 lines:2 columns:10
name3 lines:3 columns:10
name4 lines:4 columns:10
name5 lines:5 columns:10
lines:6 columns:0
wtmp lines:7 columns:7

cat /etc/passwd | awk '{FS=":"} $3 < 10 {print $1 "\t" $3}'

这是有条件的awk,条件为第三列<10,
输出为:
root❌0:0:root:/root:/bin/bash
bin 1
daemon 2
adm 3
lp 4
sync 5
shutdown 6
halt 7
mail 8

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

条件多了个BEGIN,
输出为:
root 0
bin 1
daemon 2
adm 3
lp 4
sync 5
shutdown 6
halt 7
mail 8

cat pay.txt | \
> awk 'NR==1 {printf "%10s %10s %10s %10s %10s\n",$1,$2,$3,$4,"Total"}
> NR>=2{total = $2 + $3 + $4
> printf "%10s %10d %10d %10d %10.2f\n", $1, $2, $3, $4, total}'

输出为:

  Name        1st        2nd        3th      Total
 VBird      23000      24000      25000   72000.00
DMTsai      21000      20000      23000   64000.00
 Bird2      43000      42000      41000  126000.00
cat pay.txt | \
> awk '{if (NR==1) printf "%10s %10s %10s %10s %10s\n",$1,$2,$3,$4,"Total"}
> NR>=2{total = $2 + $3 + $4
> printf "%10s %10d %10d %10d %10.2f\n", $1, $2, $3, $4, total}'

输出为:

  Name        1st        2nd        3th      Total
 VBird      23000      24000      25000   72000.00
DMTsai      21000      20000      23000   64000.00
 Bird2      43000      42000      41000  126000.00

3.文件比对工具

diff

diff基本语句:

diff file1 file2

cmp

cmp基本语句:

cmp file1 file2

总结

未完待续。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值