linux shell攻略学习笔记二
1.Cat命令
这么多命令,常用的
Cat –n file 显示文件以及行数
Cat -
echo 'Text through stdin' | cat - file.txt
Text through stdin
this is file and test #这个是file.txt的内容,而 –就是echo打印出管道符接的stdin。
2.录制并回放终端会话
利用script和scriptreplay命令
录制
$ script -t > timing.log -a output.session
type commands;
…
..
exit
两个配置文件被当做script命令的参数。其中一个文件(timing.log)用于存储时序信息,
描述每一个命令在何时运行;另一个文件(output.session)用于存储命令输出。
-t 选项用于将时序数据导入stderr。
2> 则用于将stderr重定向到timing.log。
回放
利用这两个文件:timing.log(存储时序信息)和output.session(存储命令输出信息),我们
可以按照下面的方法回放命令执行过程:
$ scriptreplay timing.log output.session
# 按播放命令序列输出
3.Find查找
1.用正则查找文件
–name -iname(忽略大小写)
find /home/slynux -name "*.txt" –print
find . -iname "example*" -print
多个条件查找
find . \( -name "*.txt" -o -name "*.pdf" \) -print
按路径匹配
find /home/users -path "*/slynux/*" -print
直接用正则
find . -regex ".*\(\.py\|\.sh\)$"
find . -iregex ".*\(\.py\|\.sh\)$"
2.否定!
find . ! -name "*.txt" -print
3.于目录深度的搜索
find . -maxdepth -name "f*" –print #最大深度
find . -mindepth -name "f*" –print #最小深度
4.根据文件类型搜索
Unix类系统将一切都视为文件。文件具有不同的类型,例如普通文件、目录、字符设备、块 设备、符号链接、硬链接、套接字以及FIFO等。 find . -type d –print #找目录
find . -type f –print #找文件
5.根据文件时间进行搜索
这个感觉很少用到 单位是天 访问时间(-atime):用户最近一次访问文件的时间。
修改时间(-mtime):文件内容最后一次被修改的时间。
变化时间(-ctime):文件元数据(例如权限或所有权)最后一次改变的时间。 这些整数值通常还带有 - 或 + :- 表示小于,+ 表示大于。
打印出在最近7天内被访问过的所有文件:
find . -type f -atime - -print
打印出恰好在7天前被访问过的所有文件:
find . -type f -atime -print
以分钟作为计量单位
-amin(访问时间);
-mmin(修改时间);
-cmin(变化时间)。
打印出访问时间超过7分钟的所有文件:
find . -type f -amin + -print
find另一个漂亮的特性是 -newer参数。使用 -newer,我们可以指定一个用于比较时间戳 的参考文件,然后找出比参考文件更新的(更近的修改时间)所有文件
找出比file.txt修改时间更近的所有文件
find . -type f -newer file.txt -print
6.基于文件大小的搜索
find . -type f -size +2k #大于2KB的文件 小于2k用- 等于不用+-
除了k之外,还可以用其他文件大小单元。
b —— 块(512字节)。
c —— 字节。
w —— 字(2字节)。
k —— 1024字节。
M —— 1024K字节。
G —— 1024M字节。
7. 删除匹配的文件
删除当前目录下所有的 .swp文件:
$ find . -type f -name "*.swp" -delete
8. 基于文件权限和所有权的匹配
find . -type f -perm -print
# 打印出权限为644的文件
用途:找出那些没有设置好执行权限的PHP文件
9. 利用find执行命令或动作(厉害了)
find命令可以借助选项-exec与其他命名进行结合。
场景:用 -user找出root拥有的所有文件,然后用-exec更改所有权。
find . -type f -user root -exec chown slynux {} \;
在这个命令中,({}其实就是类似查找出的文件的引用)
{}是一个与 -exec选项搭配使用的特殊字符串。对于每一个匹配的文件,{}会被替换成相应的文件名。例如,find命令找到两个文件test1.txt和test2.txt,其所有者均为slynux,那么find就会执行:chown slynux {}
它会被解析为chown slynux test1.txt和chown slynux test2.txt。
\; 通过转义的分号结束
find . -type f -name "*.c" -exec cat {} \;>all_c_files.txt #cat文件追加到all_file.txt
将10天前的 .txt文件复制到OLD目录中
find . -type f -mtime + -name "*.txt" -exec cp {} OLD \;
-exec结合多个命令
默认-exec执行的是单个命令,把多个命令写到一个shell脚本中(例如command.sh),然
后在-exec中使用这个脚本:
-exec ./commands.sh {} \;
Print0
find . -type f -name "*.a" -print
./a.a
./b.a find . -type f -name "*.a" -print0
./a.a./b.a
4.xargs
xargs命令应该紧跟在管道操作符之后,以标准输入作为主要的源数据流。
command | xargs
样例文件
$ cat example.txt # 样例文件
转单行
这里默认定界符为$IFS (换行/制表符/空格)
$ cat example.txt | xargs
输出:
转多行
$ cat example.txt | xargs -n
自定义定界符
通过参数 –d指定定界符
$ echo "splitXsplitXsplitXsplit" | xargs -d X
split split split split
-d –n可以一起用
$ echo "splitXsplitXsplitXsplit" | xargs -d X -n
split split
split split
一次传多个参数
--------样例sh脚本
#!/bin/bash
#文件名: cecho.sh
echo $*'#' --------样例测试文件
$ cat args.txt
arg1
arg2
arg3
1.调用三次脚本
$ cat args.txt | xargs -n ./cecho.sh
arg1 #
arg2 #
arg3 #
2.三个参数一次传入
$ cat args.txt | xargs ./cecho.sh
arg1 arg2 arg3 #
3.简化重复参数的脚本
./cecho.sh -p arg1 -l
./cecho.sh -p arg2 -l
./cecho.sh -p arg3 -l
简化后
$ cat args.txt | xargs -I {} ./cecho.sh -p {} -l
-p arg1 -l #
-p arg2 -l #
-p arg3 -l #
xargs有一个选项-I,可以提供上面这种形式的命令执行序列。我们可以用-I指定替换字符
串,这个字符串在xargs扩展时会被替换掉。如果将-I与xargs结合使用,对于每一个参数,命
令都会被执行一次。
-I {} 指定了替换字符串。
xargs -0指定null为定界符
场景:xargs的输入和输出只能是stdin和stdout
很多文件名中都可能会包含空格符(' '),因此xargs 很可能会误认为它们是定界符(例如,hell text.txt会被xargs误解为hell和text.txt)就必须将 -print0与find结合使用,以字符null ('\0')来分隔输出。
用法:
只要我们把find的输出作为xargs的输入,就必须将 -print0与find结合使用,以字符null ('\0')也就是xargs -0来分隔输出。
find . -type f -name "*.a" -print | xargs wc –l
优化后:
find . -type f -name "*.a" -print0 | xargs - wc -l
print0 是将查找结果“扁平化”放到一行,而xargs -0会用空格分割打印出各个文件。
find ./ -name "*.sh" -print0 |xargs -
./test1.sh ./test02.sh ./testlog.sh ./pass.sh ./fun.sh
补充场景:
一个文件要根据不同参数,运行同一个脚本
$ cat args.txt
arg1
arg2
arg3
脚本内容:
#!/bin/bash
#文件名: cecho.sh
echo $*'#'
普通人调用:
./cecho.sh arg1
./cecho.sh arg2
./cecho.sh arg3
有了xargs后:
cat args.txt | xargs -n ./cecho.sh
arg1 #
arg2 #
arg3 #
还有个厉害的
$ cat args.txt | xargs -I {} ./cecho.sh -p {} -l
-p arg1 -l #
-p arg2 -l #
-p arg3 -l #
其中 –p 变量 -l 里-p是不变的,-l也是不变的。
xargs有一个选项-I,可以提供上面这种形式的命令执行序列。我们可以用-I指定替换字符
串,这个字符串在xargs扩展时会被替换掉。如果将-I与xargs结合使用,对于每一个参数,命
令都会被执行一次。
还可以这样:
$ cat files.txt | ( while read arg; do cat $arg; done )
# 等同于cat files.txt | xargs -I {} cat {}
5.tr 转换
tr只能通过stdin(标准输入),而无法通过命令行参数来接受输入
tr [options] set1 set2
set1和set2代表集合 'A-Z' 和 'a-z'都是集合。
'ABD-}'、'aA.,'、'a-ce-x'以及'a-c0-9'等均是合法的集合。
就是替换set1的内容为ste2的内容,set1到set2是严格映射,如hashmap,set1是map的key,set2是map的val。
echo "HELLO WHO IS THIS" | tr 'A-Z' 'a-z'
用途1:加解密
$ echo 12345 | tr '0-9' '9876543210'
87654 # 已加密
$ echo 87654 | tr '9876543210' '0-9'
12345 # 已解密
用途2:删除字符
tr有一个选项-d,可以通过指定需要被删除的字符集合,
$ echo "Hello 123 world 456" | tr -d '0-9'
Hello world
# 将stdin中的数字删除并打印出来
补集-c
补集就是取反。
$ echo hello 1 char 2 next 4 | tr -d -c '0-9 \n'
1 2 4
通途3:删除重复
Tr –s 删除重复 下面是删除重复的空格
$ echo "GNU is not UNIX. Recursive right ?" | tr -s ' '
GNU is not UNIX. Recursive right ?
其他关键字
比如小写换大写:
echo "hello word"|tr '[:lower:]' '[:upper:]'
HELLO WORD
6.校验和
用途:Src源有文件盒MD5文件,下载目标下载文件后,用下载的md5校验文件。
用途2:MD5用来判定2个文件是否是同一个文件。
Md5
$ md5sum filename
68b329da9893e34099c7d8ad5cb9c940 filename
$ md5sum file1 file2 file3 ..
当使用多个文件时,输出中会在每行中包含单个文件的校验和:
[checksum1] file1
[checksum1] file2
[checksum1] file3
校验
如果需要用所有的.md5信息来检查所有的文件,可以使用:
$ md5sum -c *.md5
SAH-1
Sha-1和MD5类似,注意2点
- 命令变为sha1sum
- .md5文件变为.sha1。如file_sum.md5改为file_sum.sha1
加密工具与散列
感觉没啥用,不写了。
md5sum和SHA-1已不再安全。因为计算能力 的攀升使其变得容易被破解。推荐使用bcrypt或sha512sum这 类工具进行加密
8.排序、唯一与重复
排序
sort命令既可以从特定的文件,也可以从stdin中获取输入,并将输出写入stdout。uniq 的工作方式和sort一样。
(2) -n按照数字顺序进行排序:
$ sort -n file.txt
(3) -r按照逆序进行排序:
$ sort -r file.txt
(4) 按照月份进行排序(依照一月,二月,三月……):
$ sort -M months.txt
(5) 合并两个已排序过的文件:
$ sort -m sorted1 sorted2
(6) -k指定了排序应该按照哪一个键(key)来进行。
样例文件
$ cat data.txt
mac
winxp
bsd
linux
# 依据第1列,以逆序形式排序
$ sort -nrk data.txt
linux
bsd
winxp
mac
# -nr表明按照数字,采用逆序形式排序
# 依据第2列进行排序
$ sort -k data.txt
bsd
linux
mac
winxp
指定多列排序
$ cat data.txt
1010hellothis
2189ababbba
7464dfddfdfd
$ sort -nk , data.txt
起止位置是2和3,就是group by sort 第二列和第三列;不需要做切割什么的了
uniq
uniq只能作用于排过序的数据输入,因此,uniq要么使用管道,要么将排过序的文件作为
输入,与sort命令结合使用。
样例文件
$ cat sorted.txt
bash
foss
hack
hack
去重
$ sort unsorted.txt | uniq
-u找出不重复,唯一的行。
$ sort unsorted.txt | uniq -u
bash
foss
-c显示重复次数
$ sort unsorted.txt | uniq -c
bash
foss
hack
-d找出重复的行
$ sort unsorted.txt | uniq -d
hack
-s 指定可以跳过前n个字符;
-w 指定用于比较的最大字符数。
9.分割文件和
$ split -b 10k data.file -d -a 4
-b 除了k(KB)后缀,我们还可以使用M(MB)、G(GB)、c(byte)、w(word)等后缀
-d 以数字为后缀,可以另外使用-d参数
-a length可以指定后缀长度
-l, --lines=NUMBER put NUMBER lines per output file按行切割。
Csplit
$ cat server.log
SERVER-
[connection] 192.168.0.1 success
[connection] 192.168.0.2 failed
[disconnect] 192.168.0.3 pending
[connection] 192.168.0.4 success
SERVER-
[connection] 192.168.0.1 failed
[connection] 192.168.0.2 failed
[disconnect] 192.168.0.3 success
[connection] 192.168.0.4 failed
SERVER-
[connection] 192.168.0.1 pending
[connection] 192.168.0.2 pending
[disconnect] 192.168.0.3 pending
[connection] 192.168.0.4 failed
我们需要将这个日志文件分割成server1.log、server2.log和server3.log,这些文件的内容分别
取自原文件中不同的SERVER部分。那么,可以使用下面的方法来实现:
$ csplit server.log /SERVER/ -n -s {*} -f server -b "%02d.log" ; rm server00.log
$ ls
server01.log server02.log server03.log server.log
有关这个命令的详细说明如下。
- /SERVER/ 用来匹配某一行,分割过程即从此处开始。
- /[REGEX]/ 表示文本样式。包括从当前行(第一行)直到(但不包括)包含“SERVER”
- 的匹配行。
- {*} 表示根据匹配重复执行分割,直到文件末尾为止。可以用{整数}的形式来指定分割执
- 行的次数。
- -s 使命令进入静默模式,不打印其他信息。
- -n 指定分割后的文件名后缀的数字个数,例如01、02、03等。
- -f 指定分割后的文件名前缀(在上面的例子中,server就是前缀)。
- -b 指定后缀格式。例如%02d.log,类似于C语言中printf的参数格式。在这里文件名=前缀+后缀=server + %02d.log。
因为分割后的第一个文件没有任何内容(匹配的单词就位于文件的第一行中),所以我们删
除了server00.log。
根据扩展名切分文件名
借助%操作符可以轻松将名称部分从“名称.扩展名”这种格式中提取出来。你可以按照下面
的方法从sample.jpg中提取名称。
file_jpg="sample.jpg"
name=${file_jpg%.*}
echo File name is: $name
输出结果:
File name is: sample
下一个任务是将文件名的扩展名部分提取出来,这可以借助 # 操作符实现。
提取文件名中的 .jpg并存储到变量file_jpg中:
extension=${file_jpg#*.}
echo Extension is: jpg
#输出结果:
Extension is: jpg
10.交互输入自动化
echo –e实现
样例脚本
#!/bin/bash
#文件名: interactive.sh
read -p "Enter number:" no ;
read -p "Enter name:" name
echo You have entered $no, $name; $ echo -e "1\nhello\n" | ./interactive.sh
You have entered , hello
我们用echo -e来生成输入序列,-e表明echo会解释转义序列
Expect实现
在默认情况下,多数常见的Linux发行版中并不包含expect
自动化脚本
#!/usr/bin/expect
#文件名: automate_expect.sh
spawn ./interactive.sh
expect "Enter number:"
send "1\n"
expect "Enter name:"
send "hello\n"
expect eof
运行结果如下:
$ ./automate_expect.sh
解释脚本:
Spawn 参数指定需要自动化哪一个命令;
Expect 参数提供需要等待的消息;
Send 是要发送的消息;
expect eof 指明命令交互结束。
11. &并行进程
我们利用了Bash的操作符&,它使得shell将命令置于后台并继续执行脚本。这意味着一旦循环结束,脚本就会退出,而md5sum命令仍在后台运行。
为了避免这种情况,我们使用$!来获得进程的PID,在Bash中,$!保存着最近一个后台进程的PID。我们将这些PID放入数组,然后使用wait命令等待这些进程结束。
linux shell攻略学习笔记二的更多相关文章
- linux shell攻略学习笔记一 基础篇
1.#!/bin/bash shebang 可以自定义 比如 #!/bin/bash +x 就会打印出执行日志 linux中 \ 代表null \n2\n3” 会转义其中的\n,生成3行数据 $! 保 ...
- Linux Shell脚本编程学习笔记和实战
http://www.1987.name/141.html shell基础 终端打印.算术运算.经常使用变量 Linux下搜索指定文件夹下特定字符串并高亮显示匹配关键词 从键盘或文件里获取标准输入 [ ...
- Shell脚本的学习笔记二:字符串
菜鸟教程提供的Shell在线编辑器 Shell 字符串 项目 功能 单引号 原样输出,变量无效.但可用成对单引号嵌套成对单引号输出变量 双引号 定义字符串中附带有变量的命令并且想将其解析后再输出的变量 ...
- 《Unix&Linux大学教程》学习笔记二:指令常识
1:指令的本质——调用可执行程序 在Shell输入命令时,其实就是根据名称运行相应的程序. 2:在系统中查找程序 which 指令名 type 指令名 3:时间与日历 date [-选项] 参数 ca ...
- Linux——进程管理简单学习笔记(二)
计划任务: 为什么要设置计划任务 : 实现数据库备份,发送系统通知神马的..... 计划任务的命令: 一: at : 安排作业在某一时刻执行一次 nbatch 安排作业在系统负载不重时执 行一 ...
- Linux shell脚本基础学习详细介绍(完整版)一
Linux shell脚本基础学习这里我们先来第一讲,介绍shell的语法基础,开头.注释.变量和 环境变量,向大家做一个基础的介绍,虽然不涉及具体东西,但是打好基础是以后学习轻松地前提.1. Lin ...
- Linux Shell脚本攻略 读书笔记
Linux Shell脚本攻略 读书笔记 这是一本小书,总共253页,但内容却很丰富,书中的示例小巧而实用,对我这样总是在shell门前徘徊的人来说真是如获至宝:最有价值的当属文本处理,对这块我单独整 ...
- Linux内核学习笔记二——进程
Linux内核学习笔记二——进程 一 进程与线程 进程就是处于执行期的程序,包含了独立地址空间,多个执行线程等资源. 线程是进程中活动的对象,每个线程都拥有独立的程序计数器.进程栈和一组进程寄存器 ...
- kvm虚拟化学习笔记(二)之linux kvm虚拟机安装
KVM虚拟化学习笔记系列文章列表----------------------------------------kvm虚拟化学习笔记(一)之kvm虚拟化环境安装http://koumm.blog.51 ...
随机推荐
- How to: Use XPO Upcasting in XAF 如何:在 XAF 中使用 XPO 强制转换
In this topic, you will learn how to use the Upcasting feature of XPO in XAF. It is useful when you ...
- 极客必备 Chrome 浏览器插件
本文微信公众号「AndroidTraveler」首发. 自己平时使用的最多的就是 Chrome 浏览器,因此本文主要分享自己添加的一些扩展程序. 介绍扩展程序的时候也是以我本人的实际使用为主,有些功能 ...
- centos重启出现type Control-D to continue【fsck使用】
VMware vSphere克隆异常/dev/sda2:UNEXPECTED INCONSISTENCY; RUN fsck MANUALLY.(i.e.,without -a or -p optio ...
- C语言编程的一些小总结
1. static:可用于定义静态局部变量 在局部变量前,加上关键字static,该变量就被定义成为一个静态局部变量. 举一个静态局部变量的例子: void fn() { static int n=1 ...
- MySQL创建、修改、删除数据库
创建数据库 CREATE DATABASE [IF NOT EXISTS] t1 CHARACTER SET [=] utf8: 中括号中的代码可有可无:CHARATER如果不写则创建为默认的字符. ...
- 初级模拟电路:3-11 BJT实现电流源
回到目录 1. 恒流源 (1)简易恒流源 用BJT晶体管可以构造一个简易的恒流源,实现电路如下: 图3-11.01 前面我们在射极放大电路的分压偏置时讲过,分压偏置具有非常好的稳定性,几乎不受晶体管的 ...
- 用python暴力破解压缩文件并不是万能,至少这个场景我告诉你密码你用代码也破解不了
看到论坛上各种贴子写用python进行暴力破解的文章,于是自己也想去尝试一下,不试不知道,一试吓一跳,真的就像那句有名的”python由入门到放弃“,把论坛上别人的脚本全部自己敲一遍,运行不报错,但也 ...
- Nginx + FastCGI + Django在windows上部署及nginx常用命令
一般应用都是部署在linux系统上,不会在windows上部署,emmm..所以有兴趣的就瞧瞧吧哈哈 nginx工作原理: nginx用于处理静态文件,动态部分经由fastcgi .scgi或uWSG ...
- 数理统计(二)——Python中的概率分布API
数理统计(二)——Python中的概率分布API iwehdio的博客园:https://www.cnblogs.com/iwehdio/ 数理统计中进行假设检验需要查一些分布的上分位数表.在scip ...
- JSON对象转JAVA对象--com.alibaba.fastjson.JSONObject
打印结果: