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

Linux常用脚本

2015-06-19 16:48 211 查看
15. 算术比较

条件通常被放置在封闭的中括号内。一定要注意在[]与操作数之间有一个空格。

-gt:大于

-lt:小于

-ge:大于或等于

-le:小于或等于

-eq:等于

-ne:不等于

可以结合 -a 逻辑与 -o 逻辑或条件进行测试

文件系统相关属性测试:

[ -f $file_var ]    如果给定的变量包含正常的文件路径或文件名,则返回真

[ -x $var ]    如果给定的变量包含的文件可执行,则返回真

[ -d $var ]    如果给定的变量包含的是目录,则返回真

[ -e $var ]    如果给定的变量包含的文件存在,则返回真

[ -c $var ]    如果给定的变量包含的是一个字符设备文件的路径,则返回真

[ -b $var ]    如果给定的变量包含的是一个块设备文件的路径,则返回真

[ -w $var ]    如果给定的变量包含的文件可写,则返回真

[ -r $var ]    如果给定的变量包含的文件可读,则返回真

[ -L $var ]    如果给定的变量包含的是一个符号链接,则返回真

字符串比较:

使用字符串比较是,最好用双中括号,因为有时候采用单个中括号会产生错误,所以最好避开他们。

[[ $str1 = $str2 ]]    当str1等于str2时,返回真。str1和str2包含的文本是一模一样

[[ $str1 == $str2 ]]    这是检查字符串是否相等的另一种写法。也可以检查两个字符串是否不同

[[ $str1 != $str2 ]]    如果str1和str2不相同,则返回真

[[ $str1 > $str2 ]]    如果str1的字母序比str2大,则返回真

[[ $str1 < $str2 ]]    如果str1的字母序比str2小,则返回真

[[ -z $str1 ]]    如果str1包含的是空字符串,则返回真

[[ -n $str1 ]]    如果str1包含的是非空字符串,则返回真

注意:在=前后各有一个空格,如果忘记加空格,那就不是比较关系了,而变成了赋值语句

时间戳(timestamp)

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

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

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

-atime、-mtime、-ctime可作为find的时间参数。单位是天。这些整数值通常还带有-或+;-表示小于,+表示大于。

-amin(访问时间)、-mmin(修改时间)、-cmin(变化时间),单位分钟。

-newer:指定一个用于比较时间戳的参考文件,然后找出比参数文件更长的修改时间的所有文件。

find命令的时间戳操作出来选项对编写系统备份和很有帮助。

基于文件大小的搜索

find . -type f -size +2k #大于2k的文件

find . -type f -size -2k #小于2k的文件

find . -type f -size 2k  #等于2k的文件

除了k单位,还有其他文件大小单位b(块,512字节)、c(字节)、w(字,2字节)、k(千字节)、M(兆字节)、G(吉字节)

删除匹配的文件

-delete可以用来删除find查找到的匹配文件

例如:删除当前目录下所有的.swp文件:

find . -type f -name “*.swp” -delete

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

find . -type f -perm 644 -print   #打印当前目录下权限为644的文件

find . -type f -name “*.sh” -perm 755 -user root -print  #找出.sh结尾用户名为root权限为755的文件

-exec

find命令可以借助选项-exec与其他命令进行结合。

find . -type f -user root -name “*.swp” -exec rm -rf {} \;

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

-exec能够同printf结合来生成有用的输出信息。例如:

# find . -type f -name “*.swp” -exec printf “Text file:%s\n” {} \;

Text file:./1.swp

Text file:./2.swp

Text file:./3.swp

ind跳过特定的目录

在搜索目录并执行某些操作的时候,有时为了提高性能。需要跳过一些子目录。例如,程序员会在git所管理的开发源码树中查找特定的文件,源代码层级结构总

是会在每个子目录中包含一个.git目录(.git存储每个目录相关的版本控制信息)。因为与版本控制相关的目录对我们而言并没有什么用处,所以没必要去

搜索这些目录。

# find . \( -name “.git” -prune \) -o \( -type f -print \)

\( -name “.git” -prune \)的作用是用于进行排除,它指明了.git目录应该排除掉,而\( -type f -print \)指明了需要执行的动作。这些动作需要被放置在第二个语句块中

4. xargs

可以处理stdin标准输入并将其转换成特定命令的命令行参数。还可以将单行或多行文本输入转换成其他格式,例如单行变多行或是多行变单行。

将多行输入转换成单行输出

[root@server1 test]# cat example.txt

1 2 3 4 5 6

7    8 9 10

11 12

[root@server1 test]# cat example.txt | xargs

1 2 3 4 5 6 7 8 9 10 11 12

将单行输入转换成多行输出

[root@server1 test]# cat example.txt | xargs | xargs  -n 2

1 2

3 4

5 6

7 8

9 10

11 12

-d选项为输入指定一个定制的定界符

# echo “splitXsplitXsplitXsplit” | xargs -d X

split split split split

可以结合-n参数

# echo “splitXsplitXsplitXsplit” | xargs -d X -n 2

split split

split split

读取stdin,将格式化参数传递给命令

[root@server1 test]# cat args.txt

arg1

arg2

arg3

[root@server1 test]# cat args.txt | xargs -n 1 sh ./cecho.sh

arg1 #

arg2 #

arg3 #

[root@server1 test]# cat args.txt | xargs -n 2 sh ./cecho.sh

arg1 arg2 #

arg3 #

[root@server1 test]# cat args.txt | xargs sh ./cecho.sh

arg1 arg2 arg3 #

在上面的例子中,我们直接为特定的命令(例如cecho.sh)提供命令行参数。这些参数都只源于args.txt文件。

-I指定一个替换字符串,与xargs结合使用时,对于每一个参数,命令都会被执行一次。

[root@server1 test]# cat args.txt | xargs -I {} sh ./cecho.sh -p {} -l

-p arg1 -l #

-p arg2 -l #

-p arg3 -l #

-I {}指定了替换字符串。对于每一个命令参数,字符串{}会被从stdin读取到的参数所替换。使用-I的时候,命令就似乎是在一个循环中执行一样。如果有三个参数,那么命令就会连同{}一起被执行三次,而{}在每一次执行中都会被替换为相应的参数。

结合find使用xargs

# find . -tpye f -name “*.txt” -print | xargs rm -f

这样做很危险。可能会删除不必要的文件。我们没法预测分隔find命令输出结果的定界符是’\n’还是’

‘。很多文件名都可能包含空格符,而xargs很可能会误认为它们是定界符(例如,hell

text.txt会被xargs误认为hell和text.txt2个文件)

只要我们把find的输出作为xargs的输入,就必须将-print0与find结合使用,以字符null来分隔输出。

用find匹配并列出所有.txt文件,然后用xargs将这些文件删除:

# find . -tpye f -name “*.txt” -print0 | xargs -0 rm -f

这样就可以删除所有.txt文件。xargs -0将\0作为输入定界符。

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

# find src_path -type f -name “*.c” -print0 | xargs -0 wc -l

6. 排序、单一与重复

sort、uniq

按数字进行排序

# sort -n file.txt

按逆序进行排序

# sort -r file.txt

按月份进行排序(按照一月、二月、三月……这样的顺序)

sort -M months.txt

根据捡或列进行排序

[root@server1 test]# cat data.txt

1 mac     2000

2 winxp   4000

3 bad     1000

4 linux   1000

-k指定了排序应该按照哪一个键(列号)来进行。

[root@server1 test]# sort -nrk 1 data.txt   # -nr表示按第一列数字逆序排序,

4 linux   1000

3 bad     1000

2 winxp   4000

1 mac     2000

[root@server1 test]# sort -k 2 data.txt

3 bad     1000

4 linux   1000

1 mac     2000

2 winxp   4000

留意用于按照数字顺序进行排序的选项-n。就依据字母表排序和依据数字排序,sort命令对于字母表排序和数字排序有不同的处理方式。因此,如果要采用数字顺序排序,应该明确的给出-n选项

uniq

uniq命令通过消除重复内容,从给定输入中(stdin或命令行参数文件)找出单一的行。他也可以用来找出输入中出现的重复行。uniq只能用于排过序的数据输入,因此,uniq要么使用管道,要么将排过序的文件作为输入,并总是以这种方式与sort命令结合起来使用。

[root@server1 test]# cat sorted.txt

bash

hack

foss

hack

hack

[root@server1 test]# uniq sorted.txt

bash

hack

foss

hack

[root@server1 test]# sort sorted.txt | uniq

bash

foss

hack

[root@server1 test]# sort -u sorted.txt

bash

foss

hack

[root@server1 test]# sort sorted.txt | uniq -u #只显示唯一的行(在输入文件中没有出现重复的行)

bash

foss

[root@server1 test]# sort sorted.txt | uniq -c  #统计各行在文件中出现的次数

1 bash

1 foss

3 hack

[root@server1 test]# sort sorted.txt | uniq -d  #找出文件中重复的行

hack

-s指定可以跳过前N个字符

-w指定用于比较的最大字符数
1. 正则表达式
正则表达式的基本组成部分:
^       行起始标记
$      行尾标记
.       匹配任意一个字符
[]      匹配包含在[字符]之中的任意一个字符
[^]     匹配除[^字符]之外的任意一个字符
[-]     匹配[]中指定范围内的任意一个字符
?      匹配之前的项1次或0次
+      匹配之前的项1次或多次
*       匹配之前的项0次或多次
()      创建一个用于匹配的子串,例如:ma(tri)?匹配max或maxtrix
{n}    匹配之前的项n次
{n,}   之前的项至少需要匹配n次
{n,m} 指定之前的项所必需匹配的最小次数和最大次数
|        匹配|两边的任意一项
\        转义符可以将上面介绍的特殊字符进行转义

POSIX字符类是一个形如[:…:]的特殊元序列(meta sequence),它可以用于匹配特定的字符范围。

POSIX字符表如下:

[:alnum:] 字符与数字字符

[:alpha:] 字母字符(包括大写字母与小写字母)

[:blank:] 空格与制表符

[:digit:] 数字字符

[:lower:] 小写字母

[:upper:] 大写字母

[:punct:] 标点符号

[:space:] 包括换行符、回车等在内的所有空白字符

元字符是一种Perl风格的正则表达式,只有一部分文本处理工具支持它,并不是所有的工具支持它

\b 单词边界

\B 非单词边界

\d 单个数字字符

\D 单个非数字字符

\w 单个单词字符(字母、数字与_)

\W 单个非单词字符

\n 换行符

\s 单个空白字符

\S 单个非空白字符

\r 回车
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: