Linux常用脚本
2015-06-19 16:48
281 查看
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 回车
条件通常被放置在封闭的中括号内。一定要注意在[]与操作数之间有一个空格。
-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 回车
相关文章推荐
- linux下ulimit命令详解
- Linux Malloc分析-从用户空间到内核空间
- Linux 安装MySQL5.5 及 双机热备配置
- Linux如何查看服务器的并发数?
- 注意linux下面的命令行,要将PATH声明出来
- linux free 命令显示的内存信息
- linux上进程状态查询
- Linux 上安装编译 PIL 1.1.6
- Linux 上安装编译 PIL 1.1.6
- Python中获取本机内网IP(Linux)
- Linux的cron和crontab
- Git 分布式版本控制系统(一)---git for linux简介和安装
- Linux开机启动图片修改
- Linux开机启动图片修改
- Linux开机启动图片修改
- Linux开机启动图片修改 分类: arm-linux-Ubuntu TI-AM335X 2015-06-19 16:12 390人阅读 评论(0) 收藏
- Linux下R语言环境搭建
- CentOS 使用yum命令安装Java SDK(openjdk)
- linux中强大的screen命令
- 解决linux下dns缓存问题 dnscache.py