shell脚本处理工具
1、grep工具
grep是行过滤器,根据关键字进行行过滤。
grep 【选项】 '关键字' 文件名
别名定义显示颜色
grep --color=auto ‘time’ passwd :找出具有time的行并把time标红。
l临时:alias grep='grep --color=auto'
永久:vim /etc/bashrc 在文件的最后面增加一行 alias grep='grep --color=auto' source /etc/bashrc 重新读取文件使其生效。(任何用户都会生效)
选项
grep -n 'root' passwd :显示passwd中有root的行并加上行号
grep -ni 'root' passwd :显示passwd中有root的行并加上行号且忽略大小写,ROOT也会被显示出来 -i:忽略大小写
grep '^root' passwd : 显示passwd中以root开头的行
grep 'bash$' passwd : 显示passwd中以bash结尾的行
grep -v '^root' passwd :显示passwd中不以root开头的行 -v :取反的意思
grep -nA 3 '^ftp' passwd :显示passwd中以ftp开头那行的后三行,包括ftp那行。A:显示后几行
grep -nB 3 '^ftp' passwd :显示passwd中以ftp开头那行的前三行,包括ftp那行。B:显示前几行
grep -nC 3 '^ftp' passwd :显示passwd中以ftp开头那行的前后三行,包括ftp那行。C:显示前后几行
grep -w 'hello' passwd :显示passwd中有单词hello的那一行,如:hello world 和helloworld ,显示前者
grep -o 'root' passwd :只显示关键字root。
grep -cn 'root' passwd :显示passwd中有root的行并加上行号,-c 显示匹配到的次数
^$ 匹配空行
-r 逐层遍历目录查找
-l 只列出匹配的文件名
-L 只列出不匹配的文件名
-e 使用正则匹配
-E 使用扩展正则匹配
2、cut工具
cut是列截取工具,用于列的截取
cut 选项 文件名
常见选项:
-c :以字符为单位进行分割,截取
-d :自定义分隔符,默认为制表符\t(tab键)
-f :与-d一起使用,指定截取那个区域
举例说明:
cut -d: -f1 passwd :以:号为分隔符截取passwd文件的第一列(-d:也可以写成 -d ':' 或 -d ":")
cut -d: -f1,7 passwd |head :以:号为分隔符截取passwd文件的第一列和第七列(只显示前十行)
cut -c1-5 passwd :截取passwd第一到第五字符的列
cut -c10- passwd :截取passwd第10个字符以后的列(包括第十个)
cut -c5-10 passwd :截取passwd第五个到第十个字符的列
sort工具
sort用于排序,将文件的每一行作为一个单位,从首字符向后,依次按照ASCII码值进行比较,最后将他们按升序输出。
-u:去除重复行
-n :以数字排序,默认是按字符排序
-t :分隔符(相当于cut中的-d)
-k :第N列(相当于cut中的-f)
sort -n -t: -k3 passwd : 以:为分割符 以第三列为准从小到大以数字排列每行,默认为升序
sort -nr -t: -k3 passwd : 以:为分割符 以第三列为准从大到小以数字排列每行,-r 降序排列
sort -nr -t: -k3 passwd -o 1.txt : 以:为分割符 以第三列为准从大到小以数字排列每行,把排序数据放入到1.txt文件里,-o = > :覆盖输入
sort -u 1.txt :去重之后再排序,(去掉重复的行)
sort -Ru 1.txt :去重之后再随机排序 ,-R:随机排序
-f :忽略大小写的差异,例如 A 与 a 视为编码相同;
-b :忽略最前面的空格符部分
uniq工具
用于去除连续的重复行
常见选项
-i :忽略大小写
-c :统计重复行次数
-d:只显示重复行
列子:
uniq -c 1.txt :去除连续的重复行,并显示连续重复的次数
uniq -cd 1.txt :只显示连续重复的行,并显示连续重复行 重复的次数
uniq -i 1.txt :忽略大小写去除连续重复的行
tee工具
tee工具是从标准输入读取并写入到标准输出和文件,即:双向覆盖重定向 (输出 | tee 输入文件)
选项:
-a :双向追加重定向
echo 'hello woeld' |tee 1.txt : 把文本输入到屏幕,并对1.txt进行覆盖放入
echo '999' |tee -a 1.txt : 把文本输入到屏幕,并对1.txt进行追加放入
***grep -v '^#' vsftpd.conf | grep -v '^$' |tee vsftpd.conf.bak(把vsftpd.conf 中的有效行备份到vsftpd.conf.bak)***
diff工具
diff工具用于逐行比较文本的不同
**diff描述两个文件不同的方式是告诉我们怎样改变第一个文件之后与第二个文件匹配
diff 【选项】 文件1 文件2
-b :不检查空格字符的不同
-B:不检查空白行
-i:不检查大小写
-w:忽略所有空格
--normal :正常格式显示(默认)
-c :上下文格式显示
-u:合并格式显示
file1
aaaa
111
hello world
222
333
bbb
file2
aaa
hello
111
222
bbb
333
world
diff file1 file2 --normal :正常格式显示(默认)
1c1,2 第一个文件的第一行需要改变(c :改变)才能和第二个文件的第一到第二行匹配
< aaaa <小于号表示左边的文件内容(file1)
--- ---表示分隔符
> aaa 大于号>表示右边的文件内容(file2)
> hello
*** 上边代表把左边文件第一行变为aaa 和hello两行才能与file2匹配
3d3 d 删除 把左边file1的第三行删除才能与右边匹配
< hello world
5d4 把file1第五行删除才能与file2第六行匹配
< 333
6a6,7 a:添加 在file1第六行增加以下两行内容,才能与file2第六到七行匹配
> 333
> world
diff -c file1 file2 -c :上下文格式显示
*** file1 2022-04-11 19:04:13.339031376 +0800
--- file2 2022-04-11 19:04:54.756935879 +0800
***************
*** 1,6 **** 表示file1文件1到6行
! aaaa !表示改行需要修改才能与第二个文件匹配
111
- hello world -表示需要删除该行才能与第二个文件匹配
222
- 333 -表示需要删除该行才能与第二个文件匹配
bbb
--- 1,7 ---- 表示file2文件1到7行
! aaa !表示第一个文件需要修改才能与第二个文件匹配
! hello
111
222
bbb
+ 333 表示第一个文件需要增加才能与第二个文件匹配
+ world
diff -u file1 file2 -u:合并格式显示
--- file1 2022-04-11 19:04:13.339031376 +0800 ---表示file1
+++ file2 2022-04-11 19:04:54.756935879 +0800 +++表示file2
@@ -1,6 +1,7 @@ -1,6 file1一到六行 +1,7 file2 一到七行
-aaaa file1中删除此行
+aaa file1中添加此行
+hello file1中添加此行
111
-hello world file1中删除此行
222
-333 file1中删除此行
bbb
+333 file1中添加此行
+world file1中添加此行
diff也可以比较目录的不同
默认情况下也会比较目录里相同文件的内容
diff dir1 dir 2 (不只会比较目录的不同也会比较目录下相同文件内容的不同)
选项 -q :只比较目录
diff -q dir1 dir 2
其他技巧
可以通过打补丁的方式去修改文件
1、先找出文件的不同然后输出到一个文件
diff -uN file1 file2 > file.patch
-u :上下文模式
-N :像不存在的文件当作一个空文件
2、将不同内容打补丁到文件
patch file1 file.patch
3、验证
diff file1 file2
paste工具
paste用于合并文件行
选项
-d 自定义分隔符 默认为tab
-s 串行处理,非并行
paste -d: file1 file2 将两个文件同一行合并为一行显示以:为分隔符
file1:file2
file11 :file22
:file222
paste -s file1 file2 将两个文件同一行合并为一列显示
file1 file11
file2 file22 file222
tr工具
tr用于字符的转换,替换和删除;主要用于删除文件中控制字符或进行字符转换
tr 第一字符集 第二字符集
选项:
-c或——complerment:取代所有不属于第一字符集的字符;
-d或——delete:删除所有属于第一字符集的字符;
-s或--squeeze-repeats:把连续重复的字符以单独一个字符表示;
-t或--truncate-set1:先删除第一字符集较第二字符集多出的字符。
常匹配字符串
[:alnum:]:字母和数字
[:alpha:]:字母
[:cntrl:]:控制(非打印)字符
0-9[:digit:]:数字
[:graph:]:图形字符
a-z[:lower:]:小写字母
[:print:]:可打印字符
[:punct:]:标点符号
[:space:]:空白字符
A-Z[:upper:]:大写字母
[:xdigit:]:十六进制字符
[:blank:]:所有水平空白
例子
tr 'a-z' 'A-Z' <1.txt :把文件1.txt里的小写字母替换为大写字母
tr '0-9' '@' <1.txt :把文件1.txt里的数字替换为@
tr ':/' '#' 1.txt :把1.txt文件的:和/换成#
tr -d 'a-z' <1.txt :删除文件中的小写字母(要删啥就往第一字符集里加啥)
echo "thissss is a text linnnnnnne." | tr -s ' sn' :压缩连续的s和n
this is a text line.
shell中的通配符
常见快捷键
ctrl +c 终止某个操作
z 将前台运行的程序挂到后台
d 退出 等于exit
1 清屏等于clear
a 光标移动到命令行最前端
e 光标移动到命令行最后端
u 删除光标前所有字符
k删除光标后所有字符
r 搜索历史命令(输入关键字即可)
常用通配符
* :匹配0或多个字符
? :匹配任意单个字符
[list] :匹配[list]中的任意单个字符或者一组单个字符 file[abc] 匹配filea或fileb或filec, file[1-47] 匹配file1到file4和file7 (-必须后边的大于前边的)
[!list] :匹配除[!list]中的任意单个字符 或一组单个字符[!abc] 匹配除filea、fileb、filec 外的任意file加一个字符
{string1,string2,.......} :匹配string1,string2 ,或更多字符 file{3..6}(必须要两个点) 匹配file3 file4 .....file6 or file{3,4,5,6,}
例子:有两个文件file1 ,file11
ls -l fi* 或者 flile*能匹配到两个文件 ls -l file1* 能匹配到file1
但ls -l file1? 匹配不到file1 且 ls -l fil? 匹配不到连个文件 只有ls -l file? 匹配到file1 ls -l file1?匹配到file11
bash中的引号
双引号"" :会把引号内的内容当成整体来看,允许通过$符合引用其他变量值
单引号'' : 会把引号内的内容当成整体来看,禁止引用其他变量值,shell中特殊符号都被视为普通字符
反撇号`` :反撇号和$()一样,引号或括号里的命令会优先执行,如果存在嵌套,反撇号不能用
echo "$(date +%F)" = echo "`date +%F`"
echo `echo "`date +%F`"` 这就是嵌套,是不允许的会报错,可以改为 echo $(echo "`date +%F`")