shell 杂记主要记录shell使用的以下小技巧,及命令。
从给定的文件中查找最大数及最小数
问题
从下述文件中找到最大值机最小值并打印。
1 | [root@hadoop01 shell]# cat number.txt |
实现
1 | [root@hadoop01 shell]# cat number.txt | sed 's/ /\n/g' | grep -v '^$' | sort -nr | sed -n '1p;$p' |
过滤指定类型及大小的文件
1 | find . -maxdepth 1 -type f -size +50M -name '*.txt' |
过滤10天以前的文件
1 | find . -maxdepth 1 -type f -mtime +10 -name '*.txt' |
过滤最经10天的文件
1 | find . -maxdepth 1 -type f -mtime -10 -name '*.txt' |
将匹配到的文件删除
1 | find . -maxdepth 1 -type f -mtime +30 -name '*.txt' -exec rm -rf {} \; |
awk玩法
输出指定列的内容
1 | [root@hadoop01 shell]# cat hosts |
注:
awk -F[sep] 该参数可重新指定列分割标识符
linux shell 中 %% *的含义
定义了一个变量:
1 | file=/dir1/dir2/dir3/my.file.txt |
可以用${ }分别替换得到不同的值:
1 | ${file#*/}:删掉第一个 / 及其左边的字符串:dir1/dir2/dir3/my.file.txt |
记忆的方法为:
#是 去掉左边(键盘上#在 $ 的左边)
%是去掉右边(键盘上% 在$ 的右边)
单一符号是最小匹配
两个符号是最大匹配
shell read 用法
read命令用于从标准输入中读取输入单行,并将读取的单行根据IFS变量分裂成多个字段,并将分割后的字段分别赋值给指定的变量列表var_name。第一个字段分配给第一个变量var_name1,第二个字段分配给第二个变量var_name2,依次到结束。如果指定的变量名少于字段数量,则多出的字段数量也同样分配给最后一个var_name,如果指定的变量命令多于字段数量,则多出的变量赋值为空。
如果没有指定任何var_name,则分割后的所有字段都存储在特定变量REPLY中。
1 | usage: read [-ers] [-a array] [-d delim] [-i text] [-n nchars] [-N nchars] [-p prompt] [-t timeout] [-u fd] [name ...] |
参数说明
1 | 选项说明: |
将读取的内容分配给数组变量,从索引号0开始分配(-a)
1 | [root@hadoop01 shell]# read -a arr |
指定读取行的结束符号,而不再使用换行符(-d)
1 | [root@hadoop01 shell]# read -d q arr |
限制输入字符(-n or -N)
1 | # 长度为5时自动结束 |
给出输入提示(-p)
1 | [root@hadoop01 shell]# read -p "Input your name: " NAME |
“-p”选项默认不带换行功能,且也不支持”\n”换行。但通过$’string’的方式特殊处理,就可以实现换行的功能。
1 | [root@hadoop01 shell]# read -p $'Input your name: \n' NAME |
禁止转义(-r)
1 | [root@hadoop01 shell]# read -r |
不回显输入的字符(-s)
1 | [root@hadoop01 shell]# read -sp "input password: " |
将读取的行分割后赋值给变量
1 | [root@hadoop01 shell]# read year month day |
shell for 循环
数字性循环
列表for循环.
1 | !/bin/bash |
1 | !/bin/bash |
1 | !/bin/bash |
1 | !/bin/bash |
不带列表for循环.
1 | pra_for.sh |
字符性循环
1 | !/bin/bash |
路径查找.
1 | !/bin/bash |
1 | !/bin/bash |
shell while 循环
shell until 循环
shell select 循环
select in 循环用来增强交互性,它可以显示出带编号的菜单,用户输入不同的编号就可以选择不同的菜单,并执行不同的功能。
Shell select in 循环的用法
1 | select variable in value_list |
variable 表示变量,
value_list 表示取值列表,
in 是 Shell 中的关键字。
示例
1 | !/bin/bash |
1 | !/bin/ksh |
Shell 循环控制break/continue
break
break语句用于终止整个循环的执行
语法:
1 | break |
示例:
1 | !/bin/sh |
continue
ontinue语句break命令类似,但它会导致当前迭代的循环退出,而不是整个循环。
这种参数是有用的,当一个错误已经发生,但你想尝试执行下一个循环迭代。
语法:
1 | continue |
示例:
1 | !/bin/sh |
shell 几中专用修饰符
- :- ,${variable:-word} 如果variable已经被设置了,且不为空,则代入它的置,否则代入word;
1 | fruit=peach |
- :+ , ${variable:+word}如果变量variable已被设置且值为非空,代入word值,否则什么也不代入,
1 | foo=grapes |
- := , ${variable:=word}如果variable已经被设置且不为空,则代入它的值,否则代入word,并且在后面variable始终为word的值。位置参量不能用这种方式赋值。
1 | name= |
- :? , ${variable:?word} 如果变量variable已被设置值且为非空,就代入它的值,否则输出word并从shell中退出,如果有省略了word,就会显示信息:parameter null or not set.
1 | echo ${namex:?"namex is undefined"} |
- ${variable:offset:length}
${variable:offset} 获得变量从variable值中位置从offset开始的子串,偏移为从0到串尾。
${variable:offset:length} 获得variable值位置从offset开始长度为length的子串。
1 | var=notebook |