Linux Shell 学习笔记(二) 命令
2017-11-10 19:59
330 查看
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 arg aecc s.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 交互命令结束
相关文章推荐
- linux shell编程学习笔记(5)shell运算符号和运算命令
- Linux shell命令脚本学习笔记
- Linux Shell学习笔记3:更多的bash shell命令
- Linux shell 学习笔记 之 find命令的使用
- linux shell脚本攻略 学习笔记2 -- 第二章 命令之乐
- linux shell 学习笔记--内部命令学习
- 写得蛮好的linux学习笔记(主要是linux shell命令)
- Linux Shell学习笔记2:基本的bash shell命令
- 写得蛮好的linux学习笔记(主要是linux shell命令)
- Linux Shell 学习笔记3:环境变量的操作及相关命令
- linux shell脚本学习笔记二 使用结构化命令
- linux shell 脚本命令学习笔记
- Linux Shell 学习笔记(七)---echo命令和printf命令
- Git命令学习笔记
- 二.linux学习笔记-命令基本格式及文件处理命令
- Docker学习笔记:Docker 基础用法和命令帮助
- Linux shell 脚本攻略 学习笔记-9
- linux命令学习笔记(32):gzip命令
- linux命令学习笔记(55):traceroute命令
- linux命令学习笔记(10):cat 命令