Linux Shell 学习笔记(二) 命令

来源:互联网 发布:双向数据绑定 编辑:程序博客网 时间:2024/06/05 06:15

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 将时序信息输出到stderr2>timming.log 将stderr重定向到timming.log-a output.session 将命令输出存储到output.session#接下来所有的终端输入输出都会被记录在上述两个文件中,直至用户输入exit结束录制

2.2 scriptreplay

scriptreplay timming.log ouput.session   # 输出录制的终端活动

3. 文件查找与文件列表 find命令

# 列出目录及子目录中的所有文件和文件夹find pathVar                默认使用参数 -printfind pathVar -print         多行输出find pathVar -print0        单行输出# 根据文件名/正则查找文件find pathVar -name "*.txt" -printfind 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 sizeNumfind . -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 611 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/bashecho $*# 输出脚本接收到的参数# 将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 dstCharSetecho "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 fileNameecho $?                            # 输出 0,则文件被排序过# 依据键或者列进行排序文件example.txt内容1   mac     10002   linux   40003   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 -uuniq -u sortedFile# 统计各行出现的次数sort fileName | uniq -cuniq -c sortedFile# 输出出现多次的行uniq -d sortedFileuniq -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=1for img in *.jpg *.pngdonew=image-$count.${img##*.}mv "$img" "$new" 2 > /dev/nullif [$? -eq 0];then echo "renaming $img to $new"let count++fidone

11. 交互式输入自动化

# 命令脚本#! /bin/bash#fileName script.shread -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.shexpect "number"send "1\n"expect "word"send "ssss\n"expect eof# 注意 #!/usr/bin/expect# spawn                 指定要自动化执行的脚本# expect "number"       send参数以前,要等待的消息# send "1\n"            要发送的消息,注意换行符# expect eof            交互命令结束
原创粉丝点击