文章目录
前言
这个部分想写一下基本的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
总结
未完待续。