Linux Shell 学习笔记(二) 命令
Linux Shell 学习笔记(二) 命令
环境: Centos 7 bash
本博文介绍Linux中经常使用的命令
1. cat命令
cat file1 file2 .. file3
#将多个文件的内容输出到stdout
cat命令不仅可以将文件内容输出到stdout,还可以将stdin中获得输入进行输出
echo "this is form stdin" | cat - fileName
# - 用来指代stdin
cat 压缩空白行 cat -s fileName
cat 标记行号 cat -n fileName
2. 录制与回放终端会话
2.1 script命令
# 开始录制命令
script -t 2>timing.log -a output.session
-t 将时序信息输出到stderr
2>timming.log 将stderr重定向到timming.log
-a output.session 将命令输出存储到output.session
#接下来所有的终端输入输出都会被记录在上述两个文件中,直至用户输入exit结束录制
2.2 scriptreplay
scriptreplay timming.log ouput.session
# 输出录制的终端活动
3. 文件查找与文件列表 find命令
# 列出目录及子目录中的所有文件和文件夹
find pathVar 默认使用参数 -print
find pathVar -print 多行输出
find pathVar -print0 单行输出
# 根据文件名/正则查找文件
find pathVar -name "*.txt" -print
find pathVar -iname "*.txt" -print # 在查找试忽略文件名参数的大小写
# 使用多个查找条件
find pathVar \( -name "*.txt" -o -name "*.sh" \) -print
# 匹配路径
find pathVar -path "*mn" -print
#将匹配pathVar目录下路径或文件命中含有mn的所有文件
# 正则表达式
find pathVar -regex ".*" # 匹配所有无内件和文件夹
find pathVar -regex ".*\.sh" # 匹配shell脚本
# 否定
find pathVar ! -name "*.txt" # 匹配目录下所有非txt的文件
# 搜索目录深度
-maxdepth #搜索结束目录层数
-mindepth #搜索起始目录层数
# 指定搜索文件类型
-type typeVar
参数:
d 目录
f 普通文件
c 字符设备文件
b 块设备文件
l 符号链接
s 套接字
p FIFO
# 根据文件时间进行搜索
linux文件有三个时间戳
-访问时间(-atime) 文件最近一次被访问的时间戳
-修改时间(-mtime) 文件最近一次被修改的时间戳
-变化时间(-ctime) 文件元数据(权限所有权等)改变的时间
find . -type f -atime 7 -print # 恰好在7天前被访问过的文件
find . -type f -atime -7 -print # 在7天内被访问过的文件
find . -tyoe f -atime +7 -print # 超过7天被访问过的文件
'-7' 代表小于7
'+7' 代表大于7
上面的三个参数都是以天为单位,还有一分钟为单位的,-amin(访问时间),-mmin(修改时间), -cmin(变化时间)
# 基于文件大小的搜索
-size sizeNum
find . -type f -size -2k # 查找小于2kb的普通文件
find . -type f -size +2k # 查找大于2kb的普通文件
除了以k为单位,还有(b--块512字节),(c--字节),(w--字),(k--千字节)
# 基于文件权限的搜索
find . -type f -perm 644 -ptint
# 基于文件所有用户搜索
find . -type -user root -print
# 基于查找结果执行命令或动作
-exec command {} \;
{} 对应每一个匹配的文件名,或者说是执行command命令的文件集
其他为固定格式
command只能是一条命令,但是我们可以把命令集写入到sheell脚本中,然后执行这个脚本文件,打到可以执行多条命令的目的
# 跳过搜索
# 对于不想搜索的目录,如.git,可以跳过
find /home -path /home/sep -prune -o -name "tmp.txt" -print
4. xargs
管道只能提供简单的输入输出流重定向,对于命令参数的调用,就无能为力。xargs可以将输入数据装化为命令行参数
example.txt文件内容:
1 2 3 4 5 6
11 12 13
# 将文本单行输出
cat example.txt | xargs # 将'\n' 替换为 ” “
# 将文本格式化输出
cat example.txt | xargs -n 3 # 默认定界符 空格
# 指定定界符 分割参数
echo "ShellXShellXShell" | xargs -d X
####输出 Shell Shell Shell
xargs重复执行命令
args.txt文件内容
arg1
arg2
arg3
myEecho.sh内容
#!/bin/bash
echo $*
# 输出脚本接收到的参数
# 将args.txt中的三个参数,依次传递给myEcho.sh脚本
cat args.txt | xargs -n 1 ./myEcho.sh
# 应对 ./myEcho.sh -p arg1 1 的命令格式,参数只有arg1是可变的
# xargs有参数-I提供对上面命令格式的支持
cat args.txt | xargs -I {} ./myEcho.sh -p {} 1
-I {} 定义替换符:用args.txt里的内容替换./myEcho.sh -p {} 1中的{}
5. tr
tr(reanslate)可以将标准输入进行替换、删除以及压缩
# 替换
# tr srcCharSet dstCharSet
echo "THIS IS MY WORDS" | tr 'A-Z' 'a-z'
# 简单加密
echo "24354673" | tr '0-9' '8967452301'
###输出 64754237
# 删除
echo "AAAAAAAAbbAAAbbbAAAAb" | tr -d 'b'
###输出 AAAAAAAAAAAAAAA
# 补集
-C set将得到set集合的补集
echo hello 123 world | tr -d -C '0-9'
###输出 123
# 压缩字符
通常情况下,删除多余的空行空格
echo "AA BB CC " | tr -s " "
输出 AA BB CC
6. 小综合
6.1 xargs+find
# 删除文件
find . -type f -name "*.txt" -print | xargs rm -f
#上文未指定定界符,可能会造成误删
#正确的做法
find . -type -f -name "*.txt" -print0 | xargs -0 rm -f
-0 参数指定定界符为"\0"
6.2 while+(子shell)
cat args.txt | (while read arg;do statements; done)
将args.txt中的行内容分配到子进程中;子进程可以对参数执行多条命令
7. 校验和与核实
校验和一般用于网络数据传输
校验和技术:md5sum sha1sum
# md5sum使用
md5sum fileName
## 输出: 96cf433c1d760bb1d59e486b4207e22f fileName
# 输出重定向
md5sum fileName > md5Result.md5
# md5sum验证
md5sum -c md5Result.md5
# sha1sum用法与md5sum相同
#只是注意 sha1sum的结果保存在.sha1为后缀的文件中
# 对于目录的检验和计算可以使用sha1deep和md5deep实现
8. 排序、单一与重复
sort命令可以帮助我们对文本文件和stdin进行排序操作
uniq命令可以从文本文件或stdin中提取一行
8.1 sort命令
# sort命令使用
sort file1 ... file2 > sortResult.txt
## 将多个文件中的每一行进行排序,结果是有序的包含所有文件内容的文件
# 找出已排序文件中不重复的行
cat sortResult.txt | uniq > uniqResult.txt
# 按照数字顺序进行排序
sort -n fileName
# 逆序排序
sort -r fileName
# 按照月份进行排序
sort -M fileName
# 判断文件是否被排序过
sort -C fileName
echo $? # 输出 0,则文件被排序过
# 依据键或者列进行排序
文件example.txt内容
1 mac 1000
2 linux 4000
3 winxp 3000
# 以第一列逆序排序
sort -rk 1 example.txt
# 指定键的起始和终结位置(应对键与键之间没有空格分隔的情况)
sort -k 2,4 example.txt
# 2,4指定键的起始位置和终结位置
# 使sort的输出的结束符为‘\0’ 与xargs命令兼容
sort -z example.txt | xargs -0
# 其他参数
-b # 忽略空格等不必要的字符
-d # 以字典序排序
8.2 uniq命令
uniq只能以排序过的数据为输入
# 对重复行只做一次输出
sort fileName | uniq
uniq sortedFile
# 输出只出现过一次的行
sort fileName | uniq -u
uniq -u sortedFile
# 统计各行出现的次数
sort fileName | uniq -c
uniq -c sortedFile
# 输出出现多次的行
uniq -d sortedFile
uniq -s 2 -w 5 sortedFile
## -s 指定 跳过每行多个字符
## -w 指定 最大的比较字符数
### 上面的命令说明 从每行的第三个字符开始比较,最多比较5个字符到第8个字符
# 输出以‘\0’为行终结符的数据 兼容xargs命令
uniq -z sortedFile
9. 临时文件命名与随机数
在编写脚本时,我们需要储存许多临时变量,最好将临时数据储存在/tmp下,该目录下的内容将在下次系统启动时被删除
temp_file = "/tmp/var.$$"
$$会被理解为当前运行脚本的进程ID
9.1 文件分割
# 生成测试文件
dd if=/dev/zero bs=100k count=1 of=data.file
### 创建大小为100kb,内容全部是0填充的文件
# 分割
split -b 10K file.data
### 分割后的文件名会有一个字母作为后缀,如果想使用数字作为后缀,使用参数-d指定
参数 -a length指定后缀长度
split命令的最后一个参数可以指定文件的前缀
# 根据文件的行数分割
split -l 10 file.data
### 分割后的每个文件中只有原文件的10行内容
9.1.1 csplit
csplit可以依据指定的条件和字符串匹配对log文件进行分割
csplit server.log /SERVER/ -n 2 -s {*} -f server -b "%02d.log"
/SERVER/用来匹配某一行,分割从此行开始
{*} 根据匹配循环执行分割,直至文件末
-s 静默模式,不打印其他信息
-f server 指定文件名前缀
-b "%02d.log" 指定文件后缀名格式
9.2 根据扩展名切分文件名
借助操作符 % 可以轻松的将名称部分从”名称.扩展名”中提取出来
#脚本实现
file_name="sample.jpg"
name=${file_name%.*}
echo $name
借助操作符 # 可将扩展名从”名称.扩展名”中提取出来
#脚本实现
file_name="sample.jpg"
name=${file_name#*。}
echo $name
实现原理
name=${file_name%.*}
${file_name%.}的语义是删除占位符%右侧的通配符(.)所匹配的字符串,通配符自右向左匹配
% 非贪婪匹配,匹配到字符串即结束,自右向左进行匹配
%% 贪婪匹配,匹配最长的字符串,自右向左进行匹配
# ##与% %%相似,匹配自左向右进行
10. 批量重命名和移动
find rename mv三个命令灵活使用
#示例脚本
count=1
for img in *.jpg *.png
do
new=image-$count.${img##*.}
mv "$img" "$new" 2 > /dev/null
if [$? -eq 0];
then
echo "renaming $img to $new"
let count++
fi
done
11. 交互式输入自动化
# 命令脚本
#! /bin/bash
#fileName script.sh
read -p "input a number" numb;
read -p "input a word" myword;
echo $numb " " $myword
执行上述脚步,我们要依次输入一个数字和一个单词。bash以一个换行符为输入结束标志。那么我们可以通过echo实现自动化输入
echo -e "1\nmyWord\n" | ./script.sh
## -e参数 指定生成输入序列
如果需要输出的参数过多或者过长,可以将参数写入文件,再将数据从文件传递到命令
echo -e "1\nmyWord\n" > arg.data
./script.sh < arg.data
11.1 expect命令
该命令需要安装
#!/usr/bin/expect
# fileName "s.sh"
spawn ./script.sh
expect "number"
send "1\n"
expect "word"
send "ssss\n"
expect eof
# 注意 #!/usr/bin/expect
# spawn 指定要自动化执行的脚本
# expect "number" send参数以前,要等待的消息
# send "1\n" 要发送的消息,注意换行符
# expect eof 交互命令结束
上一篇: Python爬虫05-bs4
下一篇: Linux学习笔记二(常用的命令)