拆分列输出
ps输出一系列的文本,取出第2列
- ps -ef|head -5 |tr -s " "|cut -d " " -f 2|grep -v “PID”
tr -s可以将多个空格变成一个空格,cut选择第二列,grep -v 去除包含PID的行 - awk相当于是tr和cut的结合体
ps -ef|head -5 |awk ‘{print $2}’ |grep -v “PID” - 其实对于这个问题,ps是有对应的选项的
ps -e --no-headers -o pid|head -4
替换字符
上面使用tr替换字符,而sed可以利用正则表达式来进行更强大的匹配替换
比如上面最后例子中的文本输出前面有一串空格,将其匹配出来并替换为空
ps -e --no-headers -o pid|head -4|sed "s/^ *//"/
shell脚本
- set -x 显示每一行 set +x取消显示
引号
" "
双引号中变量可以替换,单引号不可以
如果传递的变量中有*或?的文件通配符时,会按照路径展开。加上引号可以避免展开
message="Hello*"
echo $message
双引号中嵌套使用双引号时,使用\
转义。
单引号中无法嵌套使用单引号,需要单独转义
$?
最近一条命令的返回值$@
为命令参数,shift
可以移动位置参数
$()
可以将命令输出为字符串,``也可以实现同样的效果
$(())可以进行数值运算
select多选
PS3="question"
select item in${menu[@]}; do
echo "$item"
done
逐行读取文本
xxx.sh target < test.txt
#script
while read server; do
echo "$server $@"&#后台执行
done
wait#等待所有命令执行完成
可以在while中指定读入脚本
xxx.sh test.txt target
#script
file =$1
shift
while read server; do
echo "$server $@"&#后台执行
done<"$file"
wait#等待所有命令执行完成
makefile
在每行前面加上@可以避免输出对应行命令
tee输出文本文件同时进行管道输出
TMPFILE=/tmp/xxx.log.$$ #$$ 记录pid的值,利用这个变量避免文件名重复
{#可以书写多条命令
echo "date :$(date)"
mount -o rw,remount /dev/sda
mount -o ro,remount /dev/sda
}2>&1|tee $TMPFILE|logger -t "mountlog"
rm $TMPFILE
iconv
可以实现编码转换mail
可以发送邮件
shell字符串匹配
?
匹配单个字符,*
匹配任意内容,[0-9]
在中括号内的内容匹配一个
详细介绍
比如希望将某个文件夹中的runxxxx变成run0000xxxx,利用makefile进行匹配并执行软链接操作,只需要make extend 即可制作所有软链接
.PHONY: extend split
target:=$(wildcard run????)
extend: $(target:run%=run0000%)
run0000%: run%
echo $@
ln -s $^ $@
利用Makefile和shell脚本将文件夹中的文件分类,并分别建立到不同文件夹的软链接
0000%:
mkdir -p run$@
for root in $(wildcard run2092-2103/Jinping_1ton_Phy_20??????_0000$**.root);do echo $${root};ln -s $${root} run$@/$$(basename $${root}); done
其中利用了Makefile的二级展开$$
cal
cal [options] [[[day] month] year]
cal [options] [timestamp|monthname]
cal
显示日历,如未指定参数,显示当月的日历。
一共有两种历法可以使用,Gregorian(格里高历)和Julian(儒略历)。Gregorian在闰年的设置上有跳跃(注:此处指的是Gregorian在被100整除的年份不设置闰年),使得和太阳运行周期更为匹配。
默认情况下cal
使用1752年9月3日作为Gregorian的采用时间,此后的日历采用形式使用Gregorian,之前的形式使用Julian。
(注:注意到跳变的日期,11天被移除
$ cal 9 1752
September 1752
Su Mo Tu We Th Fr Sa
1 2 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
)
使用--reform
参数来指定仅使用某一种日历形式。
(注: 此处的--reform
参数在bash命令行中没有找到,bash中对应的另外一个命令是
$ ncal -J 9 1752
September 1752
Su 6 13 20 27
Mo 7 14 21 28
Tu 1 8 15 22 29
We 2 9 16 23 30
Th 3 10 17 24
Fr 4 11 18 25
Sa 5 12 19 26
)
警告
-j
使用序列数字来展示日期,从1月1日开始计数。但并不意味着这个选项使用了Julian日历系统。
find
参考: Debian manual
find [-H] [-L] [-P] [-D debugopts] [-Olevel] [starting-point...] [expression]
-
-H
,-L
,-P
:指定对符号链接的搜索方式,
-D
:指定debug模式,
-O
:指定查询优化级别
上述参数详细查询manual -
starting-point
可以指定搜索开始的目录 -
expression
是find功能部分,由以下几部分构成-
Tests
返回True,False,非常重要的一部分,基本上是find功能的主要实现位置
+n
:大于某个数
-amin n
: n分钟前的时刻接触过,当然可以改为-amin +n
表示n分钟以前的任何时候接触过,注意两者区别在于前者是某个指定的分钟,后者是某分钟以前
perm
:权限
size
:大小
-regex patter
:正则表达式提供了更强大的检索功能
等等其它关于文件属性的判断 -
Action
执行命令
-exec command ;
:对每一个符合条件的文件执行操作find . -amin +5 -exec ls -l '{}' \;
-exec command {} +
:将符合条件的文件作为参数执行一次操作find . -amin +5 -exec ls -l '{}' +
-
Global options
指定全局参数
-depth
指定查询深度
-maxdepth
指定最大查询深度
等等 -
Positional option
仅影响跟随其后的Test
和·Action
-daystart
-
Operators
将其它选项连接起来
-
实战例子
- 在
xxx
路径有很多文件夹,里面有文件,需要删除包含yyy.fail
文件的文件夹。解决方式可以利用find
find xxx -name "*.fail" -exec dirname {} \;|sort -u|xargs rm -r