您的位置:首页 > 运维架构 > Shell

《Linux Shell 脚本攻略》学习记录之三

2016-02-02 11:26 281 查看
CAT

cat本身表示concatenate(拼接)

cat file1 file2 file3 ...

将标准输入与另外一个文件数据结合在一起

echo 'Text through stdin' | cat - file.txt

摆脱多余的空白行

cat -s file.txt

将制表符显示为^|

cat -t file.txt

显示行号,如果要跳过空白行使用-b

cat -n file.txt

cat -nb file.txt 跳过空白行

FIND

打印文件和目录的列表

find . -print

find -name

find -iname 忽略大小写

如果匹配多个条件,使用OR

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

匹配多个文件类型

find . -regex ".*\(\.pdf\|\.txt\)$"

排除某些类型

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

基于目录深度的搜索

find . -maxdepth 1 -name "f*" -print 指定深度以内的

find . -mindepth 2 -name "f*“ -print 指定目的深度,排除一些

-maxdepth - mindeptch 作为第三个参数出现,如果作为第四个参数,效率会降低

根据文件类型进行搜索

find . -type d -print 目录

find . -type f -print 普通文件

find . -type l -print 符号链接

c 字符设备

b 块设备

s 套接字

p FIFO

根据文件时间进行搜索

UNIX/Linux文件系统中的每一个文件都有三种时间戳

访问时间(-atime): 用户最近一次访问的时间

修改时间(-mtime): 文件内容最后一次呗修改的时间

变化时间(-ctime): 文件元数据(例如权限或所有权)最后一次改变的时间

单位是天,这些整数通常还带有-或+:-表示小于,+表示大于。

打印最近7天内被访问的所有文件

find . -type f -atime -7 -print

打印出恰好在7天前被访问过的所有文件

find . -type f -atime 7 -print

打印出访问时间超过7天的所有文件

find . -type f -atime +7 -print

单位时间为分钟的

-amin (访问时间)

-mmin (修改时间)

-cmin (变化时间)

find 另一个漂亮的特性是-newer参数,使用它可以比较时间戳比参考文件更新的所有文件

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

基于文件大小的搜索

大于2k

find . -type f -size +2k

小于2k

find . -type f -size -2k

大小等于2k的文件

find . -type f -size 2k

除k之外,还有其他文件大小单元

b -块 512字节

c 字节

w 字 2字节

k 1024字节

M 1024k

G 1024M

删除所有匹配文件

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

基于文件权限和所有权的匹配

find . -type f -perm 644 -print

打印没有设置好知执行权限的文件

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

打印用户拥有的文件

find . -type f -user slynux -print

find借助-exec,执行其他命令

修改权限

find . -type f -user root -exec chown slynux {} \;all_files.txt

将10天前的.txt文件复制到OLD目录中

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

-exec 结合多个命令

-exec是单个命令的,不过可以使用一个shell脚本

-exec ./commands.sh {] \;

让find跳过特定的目录

find . \(-type -print \(-name ".git" -prune \) -o \( -type f -print\)

ARGS

一行显示参数

cat *.txt | xargs

每行3个参数

cat *.txt | xargs -n 3

使用定界符分割

echo "splixXsplixXsplixXsplix" | xargs -d X

echo "splixXsplixXsplixXsplix" | xargs -d X -n 2

TR

用tr进行转换

tr可以对来自标准输入的内容进行字符替换,字符删除,重复字符压缩,因而通常称为转换命令。

将输入字符由大写转换为小写

echo "HELLO WHO IS THIS" | tr 'A-Z' 'a-z'

tr替换

加密

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

解密

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

tr删除字符

echo "Hello 123 world 456" | tr -d '0-9'

字符集补集

echo hello 1 char 2 next 4 | tr -d -c '0-9 \n'

用tr压缩字符

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

字符类

alnum : 字母和数字

alpha : 字母

cntrl : 控制字符

digit : 数字

graph : 图形字符

lower : 小写字母

print : 可打印字符

punct : 标号符号

space : 空白字符

upper : 大写字母

xdigit : 十六进制字符

可以按照下面的方式选择并使用所需的字符类。

tr [:class:] [:class:]

例如

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

校验和与核实

md5sum filename

多个

md5sum file1 file2 file3 ...

验证

md5sum filename > file_sum.md5

md5sum -c file_sum.md5

md5sum -c *.md5

对目录进行校验和

md5deep -rl directory_path > directory.md5

-r使用递归的方式

-l使用相对路径。默认情况下,md5deep会输出文件的绝对路径。

用下面的命令进行核实

md5sum -c directory.md5

加密工具与散列

crypt,gpg,base64,md5sum,sha1sum以及openssl的用法。

gpg -c filename 读取口令加密文件

gpg filename.gpg 读取口令,然后对文件进行解密

将文件编码为Base64格式

base64 filename > outputfile

或者

cat file | base64 > outputfile

解码Base64数据

base64 -d file > outputfile

或者

cat base64_file | base64 -d > outputfile

临时文件命令与随机数

创建临时文件

filename=`mktemp`

echo $filename

创建临时目录

dirname=`mktemp -d`

echo $dirname

只生成目录或文件名,不产生文件

tempfile=`mktemp -u`

echo $tempfile

根据模板创建临时文件名

mktemp test.XXX

分割文件和数据

split -b 10k data.file 按块10k分割文件

split -b 10k data.file -d -a 4 以后缀为4位数字,-d 数字后缀 -a 表示长度

split -b 10k data.file -d -a 4 split_file split_file前缀

用行数来分割

split -l 10 data.file 分割多个文件,每个文件包含10行

csplit工具

是split工具的一个变体,split只能根据数据大小或行数来分割文件,而csplit可以根据

文本自身的特点进行分割。

SERVER-1

XXXXXXXXXX

SERVER-2

XXXXXXXXXX

SERVER-3

XXXXXXXXXX

csplit 1.txt /SERVER/ -n 2 -s {*} -f server -b "%02d.log" ; rm server00.log

/SERVER/ 用来匹配某一行,分割过程即从此处开始

{*} 表示根据匹配重复执行分割,直到文件末尾为止。可以用{整数}的形式来指定分割执行的次数。

-s 使命令进入静默模式,不打印其他信息

-n指定分割后的文件名后缀的数字个数,例如01,02,03等。

-f 指定分割后的文件前缀(在上面的例子中,server就是前缀)

-b 指定后缀格式。例如%02d.log,类似于C语言中的printf的参数格式。在这里

文件名=前缀+后缀=server + %02d.log

因为分割后的第一个文件没有任何内容(匹配的单词就位于文件的第一行中),所以我们删除了server00.log
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: