linux shell编程2

第2章 命令之乐

2.1 简介

类UNIX 命令、grep 、awk、sed、find、cat

 

2.2 cat拼接

cat简约、不试优美,用于显示或拼接文件内容

-----------------------------------------------------------

2.2.1 预备知识

标准输入的数据域文件数据的组合

 

2.2.2 实战演练

cat---》concatenate(拼接)

cat filename

-----------------------------------------------------------

2.2.3 工作原理

cat命令不仅可以读取文件并拼接数据,还能从标准输入中进行读取,从标准输入中读取,使用管道操作符。

echo 'zko' | cat - file.txt

此时,-被用来作为stdin文件的文件名

---------------------------------------

2.2.4 补充内容

cat命令一些选项

----------------------------------

1、压缩空白行

cat -s filename #压缩空白行

同时,可利用tr命令去除空白行

cat filename | tr -s '\n'

tr 的这种用法是把连续的多个'\n'字符压缩成单个'\n'

------------------------------------

2、制表符的显示

cat -T filename

3、行号

cat -n filename

---------------------------

2.3 录制回放终端会话

script scriptreply

2.3.1 预备知识

script scriptreply把终端会话记录到一个文件中,

2.3.2 实战演练

开始录制会话:

script -t 2> timing.log -a output.session

type:commands;

....

...

exit

----------------------------------------------

配置文件

timing.log存储时序信息,描述命令何时运行;

output.session存储命令输出

-t 用于将时序数据导入stderr 2>将stderr重定向至log.txt

----------------------------------------------------

回放命令执行:

scriptreply timing.log output.session

2.3.3 工作原理

script命令同样可以用于建立在多个用户之间进行广播的视频会话,

打开两个终端1和2

(1)在1中输入以下命令:

mkfifo scriptfifo

(2)在2中输入以下命令:

cat scriptfifo

(3)返回1,输入以下命令:

script -f scriptfifo

commands;

----------------------------------------------------------

如需要结束,输入exit并按回车键,得到script done,file is scriptfifo,现在1成了广播员,2成为听众。

不管1输入了什么,他都会在2或者使用了下面命令的任何终端实时播放:

cat scriptfifo

 

优点:节省带宽,实时体验

------------------------------------------------

2.4 文件查找、文件列表

find UNIX/linux 命令行中最重要的工具,解决各种难度问题。

 

2.4.1 预备知识

工作方式:沿着文件层次结构依次向下遍历,匹配符合条件的文件,并执行相应操作,基本用例与基本用法:

 

2.4.2 实战演练

列出当前目录及子目录所有文件及文件夹:

find pathname

例如:

find . print

.指定当前目录,..指定父目录,unix文件系统中约定的用法。

-print 指明打印出匹配文件的文件名(路径),'\n'作为分隔文件定界符。

-print0 指明使用'\0'作为定界符来打印每一个匹配的文件名。当文件名包含换行符时,此方法有用武之地了;

----------------------------------------------------

2.4.3 补充内容

find 命令其它选项:

 

1.根据文件名及正则表达式匹配收索:

find /home/zko -name "*.txt" -print

-iname 忽略大小写

 

2、多类型文件搜索:

find . \( -name "*.txt" -o -name "*.pdf" \) -print

注:

-name 根据给定文件名进行匹配:

-path 可以使用通配符来匹配文件路径或文件

 

例如:

find /home/zko -path "*slynux*" -print

匹配的是文件或路径

-----------------------------------

选项-regex与-path类似,知识-regex通过正则表达式来匹配、;

例如:

查找.py或者.sh文件:

find . -regex ".*\(\.py\|\.sh\)$"

类似-iregex忽略大小写

2、否定参数:

!否定:

例如:

find . ! -name "*.txt" -print

#匹配不以txt结尾的文件

----------------------------------------

3、基于目录深度的搜索:

-maxdepth -mindepth

例如:

find . -maxdepth 1 -type f -print

#只列出当前目录下的所有普通文件,即使有子目录不会打印出来。

find . -mindepth 2 -type f -print

 

注:-maxdepth -mindepth以第3个参数出现,不然影响其效率

---------------------------------------------

4、根据文件类型搜索:

文件类型:

普通文件,目录,字符设备,块设备,符号链接,硬链接,套接字以及FIFO.

-type 对文件搜索进行过滤,匹配特定的文件。

(1).列出目录:

find . -type d -print

(2)列出文件目录:

find . -type f -print

(3)只列出符号链接:

find . -type l -print

-----------------------------------------------------

参考的文件类型:

普通文件 f

目录 d

字符设备 c

块设备 b

符号链接 l

套接字 s

FIFO p

------------------------------------------

5、根据文件时间搜索:

UNIX/Linux文件系统三种时间戳:(timestamp)

访问时间:(-atime)

修改时间:(-mtime)

变化时间:(-ctime)

 

1.打印7天内被访问过的文件:

find . -type f -atime -7 -print

 

2.打印恰好在7天前被访问过的文件:

find . -type f -atime 7 -print

 

3.打印访问时间超过7天的文件:

find . -type f -atime +7 -print

--------------------------------------------------

 

-atime、-mtime、-ctime都是基于时间的参数,计量单位是天。还有其他一些参数(以分钟):

-amin 访问时间

-mmin 修改时间

-cmin 变化时间

1、打印访问时间超过7分钟的所有文件:

find . -type f -amin +7 -print

 

--------------------------------------------------

find 还有一个-newer参数;指定一个比较时间戳的参考文件,然后找出比参考文件更新的所有文件:

例如,找出比file.txt修改时间更长的文件:

find . -type f -newer file.txt -ptint

6、基于文件大小的搜索:

-size +2k /-2k

例如。

find . -type f -size -2k

其他文件大小单元:

b----------块

c----------字节

w----------字(2字节)

k----------千字节

M-----------兆字节

G-----------吉字节

7、删除匹配的文件:

-delete

find . -type f -name "*.txt" -delete

find . -type f \( -name "*.txt" -o -name "*.pdf" \) -delete

8、基于文件及所有权的匹配:

列出具有特定权限的所有文件:

find . -type f -perm 644 -print

find . -type f -name "*.php" | -perm 644 -print

-----------------------------------------------------------

选项-user USER 找出某个特定用户的所拥有文件:

USER可以是用户名或者UID:

find . -type f -user zko -print

9、结合find执行命令或动作(-exec)

将某个用户的全部文件的所有权改成另一位用户,可以用-user找出root所拥有的文件,然后用-exec更改所有权。

find . -type f -user root -exec chown zko {} \;(必须以超级用户执行)

{}是一个特殊的字符串,与exec选项结合使用,对于每一个匹配的文件,{}会被替换成相应的文件名。

 

--------------------------------------------------------

另一个例子,将给定目录中的所有C文件拼接写入一文件(用find找到所有C文件,然后结合-exec使用cat命令)

find . -type f -name "*.c" -exec cat {} \;>all_file_c.txt

 

例子:将10天前的txt文件复制到OLD目录中:

find . -type f -mtime +10 -name "*.txt" -exec cp {} OLD\;

注:-exec结合多个命令:

脚本的使用:

-exec ./commands.sh {} \;

与printf结合使用:

find . -type f -name "*.txt" -exec printf "Text file:%s\n" {} \;

10、让find跳过特定的目录:(修剪技术)

find devel/source_path \( -name "*.git" -prune \) -o \( -type f -print \)

打印不包括.git目录中的所有文件的名称.

\( -name "*.git" -prune \)作用是用于排除

----------------------------------------------------

2.5 玩转xargs

使用管道将一个命令的输出(stdout)重定向到另一个命令的输入(stdin)

cat foo.txt | grep "test"

但是,有些命令只能以命令行参数形式接收数据,无法通过stdin接收数据流。

xargs擅长将标准输入数据转换成命令行参数。构建单行命令工具

--------------------------------------------------------

2.5.1 预备知识

command | xargs

2.5.2 实战演练

xargs把stdin接受的数据重新格式化,再将其作为参数提供给其他命令。

1、多行输出转化为单行输出:

cat example.txt

---> 1 2 3

4 5

6

cat example.txt | xargs

--->1 2 3 4 5 6

2、单行输出转化为多行输出:

cat example.txt | xargs -n 3#每行3个参数

-----------------------------------------------------

2.5.3 工作原理

xargs选项

自定义的定界符分隔参数:-d选项

echo "splitxsplitxsplitxsplit" | xargs -d x

-->split split split split

echo "splitxsplitxsplitxsplit" | xargs -d x -n 2

-->split split

split split

2.5.4 补充内容

 

#!/bin/bash

#filename:cecho.sh

echo $*'#'

 

./cecho.sh arg1 arg2

-->arg1 arg2#

 

cat args.txt

-->arg1

arg2

arg3

 

cat args.txt | xargs -n 1 ./cecho.sh

-->arg1#

arg2#

arg3#

---------------------------------

INPUT | xargs -n x

例如:

cat args.txt | xargs -n 2 ./cecho.sh

-->arg1 arg2#

arg3#

cat args.txt | xargs ./cecho.sh

-->arg1 arg2 arg3#

 

----------------------------------------------

如下:./cecho.sh -p arg1 -l

xargs -I选项指定一个替换的字符串

cat args.txt | xargs -I {} ./cecho.sh -p {} -l

-->-p arg1 -l #

-p arg2 -l #

-p arg3 -l #

-------------------------------------------------------------

2.结合find使用xargs

find . -type f -name "*.txt" -print | xargs rm -f # 不安全

find . -type f -name "*.txt" -print0 | xargs -0 rm -f

#xargs -0将“\0”作为输入定界符

3.统计源代码目录中所有C程序文件的行数:

find source_code_dir_path -type f -name "*.c" -print0 | xargs -0 wc -l

-----------------------------------------------------------------------

4.结合stdin,巧妙运用while语句和子shell

cat file.txt | (while read arg;do cat $arg;done )

===cat file.txt | xargs -I {} cat {}

 

注:

cmd0 | ( cmd1;cmd2;cmd3) | cmd4

若cmd1为cd / ,那么会改变 子shell工作目录,然而,这种改变只是局限于子shell内部,cmd4则完全不知道工作目录发生变化。

-----------------------------------------------------

2.6 用tr 进行转换

tr对来自标准输入的字符串进行替换、删除、以及压缩。将一组字符转换成另一组字符。(translate)命令

----------------------------------------------------------

2.6.1 预备知识

tr只能从标准输入,无法通过命令行参数接收输入。

tr [options] set1 set2

 

若set1 set2长度不相等,set2不断重复最后一个字符直到与set1相等。

------------------------------------------------------------

2.6.2 实战演练

1.大写变小写:

echo "ZKOLOVELLM"| tr 'A-Z' 'a-z'

2.工作原理

通过在tr中使用集合的概念,轻松映射字符集,加密与解密

echo 12345 | tr '0-9' '9876543210'

---》87654#加密

echo 87654 | tr '9876543210' '0-9'

---》12345#解密

--------------------------------------------

ROT13加密算法:

echo 'tr' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz' 'NOPQRSTUVWXYZABCDEFGHIJKLMnopqrstuvwxyzabcdefghijklm'

--->ge

echo 'ge' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz' 'NOPQRSTUVWXYZABCDEFGHIJKLMnopqrstuvwxyzabcdefghijklm'

--->tr

-----------------------------------------------------

cat file.txt | tr '\t' ''#制表符换成空格

2.6.4 补充内容

1.tr 删除空格

-d 选项

cat file.txt | tr -d '0-9'

例子:

echo "hello 123 world 345" | tr -d '0-9'

-->helo world

 

2.字符补集

-c选项

tr -c [set1] [set2]

经典案例:

echo "hello 123 world 345" | tr -d -c '0-9 \n'

-->123 345

3.tr压缩字符

-s压缩输入中重复的字符,方法如下:

echo "GNU is not UNIX ."| tr -s ' '

-->GNU is not UNIX .

4.将文件中数字相加

cat sum.txt

-->1

2

3

4

5

cat sum.txt | echo $[ $(tr '\n' '+' ) 0 ]

----->15

tr将'\n'换成’+‘,尾部加0

等价于echo $[1+2+3+4+5]

5.补充

tr '[:lower:]' '[:upper:]'

--------------------------------------------

2.7 校检和与核实

校检和是从文件中生成校检和密匙,核实完整性。

2.7.1 预备知识

校检和技术md5sum和shalsum,生成校检和,来验证和核实文件完整性。

2.7.2 实战演练

计算md5sum,使用命令:

md5sum filename

-->..................(32字符的十六进制字符串)

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值