Shell好玩的
三个概念:
stdout 标准输出设备 (printf(“..”))
stderr 标准错误输出设备
两者默认向屏幕输出,其中stdout 输出到磁盘文件,stderr输出到屏幕
stdin 标准输入设备
1.录制屏幕操作
$script -t 2> time.log -a output.session
time.log描述每个命令在何时运行 output.session存储命令输出
-t 将数序数据导入stderr 2> 将stderr重定向到time.log
$scriptreplay time.log output.session 按照播放命令序列输出
2.在第二个终端演示操作
terminal_1
$mkfifo scriptfifo
terminal_2
$car scriptfifo
terminal_1
$script -f scriptfifo
$command;
$exit;
3.显示行号 移除空白行
#$cat -n file.txt | tr -s '\n'
创建多级目录树
#$mkdir -p /path1/path2/path3
打印访问时间超过7分钟的所有文件 atime 访问时间 mtime 修改时间 ctime 变化时间 分钟amin mmin cmin 后面参数 用+ -来控制大于还是小于 这个时间参数
#$find . -type f -amin +7 -print 打印访问时间超过7分钟的所有文件
#$find . -type f -newer file.txt -print 找出比file.txt更新的文件
#$find . -type f -size +2k 找出大于2KB的文件 b块 c字节 w字 k千字节M兆字节G吉字节
#$find . -type f -name “*.swp” -delete 删除找到的swp 文件
#$find . -type f -perm 644 -print 找出特定权限的所有文件
#$find . -type f -name “*.php” ! -perm 644 -print 找出没有设置644权限的php文件
#$find . -type f -user slynux -print 找出用户slynux拥有的所有文件 -user跟用户名或UID
#find . -type f -user root -exec chown tom {} \; 用-exec执行找到的文件的后续操作 {}特殊的字符串,配合-exec 使用。对于每个匹配的文件{}会被替换成相应的文件名
#find . -type f -name “*.c” -exec cat {} \;>all_c_files.txt 把所有的c文件合并到一个文件。
#find . -type f -mtime +10 -name “*.txt” -exec cp {} OLD \; 把10天前的txt文件复制到OLD目录中.
-exec 只能直接使用单个命令,可以 -exec ./commands.sh {} \; 来把多个命令写到sh里面去
#$find devel/source_path \( -name “.git” -prune \) -o \( -type f -print \)
跳过含有.git目录的 \( -name “.git” -prune \) 排除.git目录
\( -type f -print \) 然后 -o匹配多个条件中的1个
#find ./etc -name “*.php” | xargs grep -n “需要匹配的文字” >>/home/www
#cat test.txt | xargs 把多行输入转换成单行输出
#cat test.txt | xargs -n 3 把单行输入转换成多行输出 每行n个参数(根据空格来划分参数)
4.echp 输出
#$echo “efwkfjwfjewklfjweklfjeklwjfwe4tjrklegnmer12312j3kljklfwe” | xargs -d X
-d用来指定采定界符 这里用的X分开
#$echo “efjwkfjewklfjewklfjweklfjekwfjlekw” | xargs -d k -n 2
把输入划分成2行,以k为定界符
#$echo -ne 'aaa\nbbb\nccc\n'>>1.txt -n不显示换行-e解释反斜杠 \n新行
#$echo file.txt | tr -d '[set1]' 删除file.txt 含有[set1] 并打印剩余的
#$echo file.txt | tr -d -c '[set2]' 删除除了 -c 补集以外的所有内容
#$echo “string. string” | tr -s '' 用tr -s 压缩空白字符
#$cat sum.txt | echo $(tr '\n' '+') 0 ]
sum.txt 为 1 2 3 4 5 6
用tr把 \n 替换为+ ,这样变成了1+2+3+4+5+6+,追加0,$[] 执行算数运算,变成了
echo $(1+2+3+4+5+6+0)
5.校检文件
md5sum sha1summ
md5sum filename > filename.md5 把产生的md5码重定向到.md5
#uniq 从文本stdin中提取单一的行,并且去掉重复的行
#cat sorted_file.txt | uniq>uniq_lines.txt 找出已排序文件中不重复的行
6.排序
#$sort -n file.txt 按照数字排序
#$sort -r file.txt 按照逆序进行排序
#$sort -M months.txt 按照月份时间排序
#$sort -m sorted1 sorted2 合并两个拍过序的文件,并且不需要对合并后的文件再进行排序.
#$cat data.txt
1 mac 2000
2 winxp 4000
3 bsd 1000
4 linux 1000
#$sort -nrk 1 data.txt 按照键排列 -k指定排序按照哪个键key排序, 键指的是列号, -r 表示逆序-n数字排序
4 linux1000
3bas1000
2winxp4000
1mac2000
#sort -k 2 data.txt
3bsd1000
4linux1000
1mac2000
2winxp4000
-k 可以是一个范围,当字符串没有用空格隔开时, #$sork -nk 2,4 data.txt
用第一个字符作为键#$sork -nk 1,1 data.txt
#$sort unsorted.txt | uniq 排序并且去掉重复行 等于 #$sort -u unsorted.txt
#$sort unsorted.txt | uniq -d 找出文件中重复的行
#$sort unsorted.txt | uniq -c 统计各行出现的次数
-s 跳过前N个字符-w 指定用于比较的最大字符数
#$find /etc -name “*” | xargs grep “hello abcserver” > ./cqtest.txt
grep 后-n 可以显示行号
#$uniq 消除重复内容, 只能用于排过序的数据输入,找出单一的行
#$cat 1.txt
aaa
cca
ccb
aab
aac
bbb
ccc
bbb
aaa
bbb
ccc
ddd
#$sort 1.txt | uniq 排序并且去掉重复的行 (单一行,重复的行只打印出一次)
和 #$sort -u 1.txt 一个意思 #$sort 1.txt | uniq -u
#$sort 1.txt | uniq -c 统计各行出现的次数
#$sort 1.txt | uniq -d 找出重复的行
7.排序末尾和开头
#$tail head -n num filename 打印后 前 多少行
#$tail -f /log -f随着数据的更新实时打印更新的内容 和#$dmesg | tail -f
#$tail -f /log –pid $PID 跟踪进程PID来实时
列出目录 目录的文件类型字符是d, ^是行首标记
#$ls -d */
#$ls -F | grep “/$”
#$ls -l | grep “^d”
8.pushd popd 快速定位
pushd 把路径压入栈, 依次压入 popd 依次栈目录删除路径 dirs 查看栈内容
#$pushd /home/www
#$pushd /usr/share
#$pushd /usr/src
#$dirs
~ /usr/src /usr/share /home/www
0 1 2 3
切换路径#$pushd +3 会切换到/home/www 并且改变栈地址(栈翻转) popd pushd +no o从左到邮 从0-n计数
两个目录 可以用 #$cd - 切换
9.统计文件
wc统计文件的行数,单词数,字符数 (word count) 直接wc file 会打印出文件的行数 单词数 字符数
#$wc -l file 统计行数
#$cat file | wc -1 将stdin作为输入
#$wc -w file 统计单词数
#$cat file | wc -w
#$wc -c file 统计字符数
#$cat file | wc -c
#$echo -n 12345 | wc -c 统计文本的字符数 -n避免echo添加额外的换行符
#$wc file -L 打印最长行的长度
10. 打印文件目录
tree 以图形化的树状结构打印文件和目录
#aptitude install tree
#tree path =P pattern 重点标记出匹配某种样式的文件.
#$tree PATH -p “*.sh”
#tree path -I pattern 重点标记出除符合某种样式之外的那些文件
#tree -h PATH同时打印出文件和目录的大小
#$tree path -H http://localhost -o out.html 用tree打印出html输出
11.shell正则
^ 行起始标记 $ 行尾标记 . 匹配任意一个字符
[] 匹配包含之中的任意一个字符 coo[kl] 匹配cook 或cool
[^] 匹配 除了 指定范围内的任意一个字符 9[^01] 匹配92 93 不匹配90 91
[-] 匹配指定范围内的任意一个字符 [1-5] 匹配1~5的任意一个数字
? 匹配之前的项 一次或0次 colou?r 匹配color 或colour 不匹配colouur
+ 匹配之前的项 一次或多次 rollno-9+ 匹配rollno-99 rollno-9 不匹配rollno-
* 匹配之前的项 0次或多次 co*l 匹配 cl col coool 等 包括1次
() 创建一个用于匹配的子串ma(tri)?x 匹配max 或者maxtrix
{n} 匹配之前的项n次 [0-9]{3}匹配任意一个三位数 [0-9]{3} =[0-9][0-9][0-9]
{n,} 之前的项至少需要匹配n次 [0-9]{2,} 匹配任意一个两位数字或者更多位的数字
{n,m} 指定之前的项所必须匹配的最小次数和最大次数 [0-9]{2,5}匹配从两位数到五位数之间的任意一个数字
| 交替 匹配|两边的任意一项 Oct (1st | 2nd) 匹配Oct 1st 或Oct 2nd
\ 转义符将上面的特殊符号进行转义 a\.b 匹配a.b 不能匹配ajb
perl的元字符
\b 单词边界 \bcool\b 匹配 cool 不匹配coolant
\B 非单词边界 cool\B 匹配coolant ,不匹配cool
\d 单个数字字符 b\db 匹配b2b 不匹配bcb
\D 单个非数字字符 b\Db 匹配bcb 不匹配b2b
\w 单个单词字符(字母,数字,_) \w匹配1或a 不匹配&
\W 单个非单词字符 匹配& 不匹配1或a
\n 换行符 \n匹配一个新行
\s 单个空白字符 x\sx匹配x x,不匹配xx
\S 单个非空白字符 \x\S\x 匹配xkx,不匹配xx
\r 回车
12.greo详解
#$grep 搜索文本
#$grep “match_text” file1 file2 file3 … 搜索多个文件
#$grep wold filename –color=auto 重点标记出匹配到的单词
#$grep -E “正则表达式” 或者用egrep “正则表达式”
#$echo “match_text” | grep -o -E “[a-z]+\.” 只输出文件中匹配到的文本部分,用-o
#$grep -v “match_pattern” file 打印除包含match_pattern的行之外的所有行 -v将结果反转
#$grep -c “match_pattern” file 统计文本或者文本中包含匹配字符串的行数,不是匹配的次数
统计文件中匹配项的数量,
#$echo -e “1 2 3 4\nhello\n5 6” | egrep -o “[0-9]” | wc -l
#$grep -n 打印出包含匹配字符串的行数
#$grep -b 打印字符偏移值 一般是配合-b -o
#$grep -l 搜索所个文件并找出匹配文本位于哪一个文件中 -L 返回一个不匹配的文件列表
#$grep “match_text” . -R -n 多级目录递归
#$grep -i 不考虑字符的大小写
#$grep -e “pattern1” -e “pattern2” 匹配多个样式
或者是先指定多个pattern 然后用-f 执行grep #$echo hello this is cool | grep -f patfile
#$grep “main()” . -r –include *.{c.cpp} 在目录中递归搜索所有的.c 和.cpp文件
#$grep “main()” . -r -exclude “readme” 排除所有readme文件
排除目录—exclude-dir 从文件中读取所许排除的文件列表 –exclude-from file
#$grep -A 3匹配某个结果之后的3行 -B 3 匹配结果之前的3行 -C 3匹配结果之前和之后的3行
#echo -e “a\nb\nc\na\nb\nc” | grep a -A 1 多个匹配,以一行 – 作为各匹配之前的定界符
12. cut切分文件
#cut 切分文件
#$cut -f field_list filename 提取第一个字段或者列,field_list用逗号分割
#$cut -f 2,3 filename 显示第2,3列
#$cut -f1 filename cut -s 不打印制表符
#$cat student_data.txt
NoNameMarkPercent
1Sara4590
2Alex4998
3Anu4590
#$cut -f1 student_data.txt
No
1
2
3
#$cut -f2,4 student_data.txt
NamePercent
Sara90
Alex98
Anu90
#$cut –cimplement 补集
#$cut -f3 –complement student_data.txt 分割除了第3列的其他列
NoNamePercent
1Sara90
2Alex98
3Anu90
#$cat delimited_data.txt 指定字段的定界符 使用-d选项
#$cut delimited_data.txt
No;Name;Mark;Percent
1;Sara;45;90
2;Alex;49;98
3;Anu;45;90
#$cut -f2 -d”;” delimited_data.txt
Name
Sara
Alex
Anu
#$cut 指定字段的字符或者字节范围
N- 从第N个字节,字符或者字段到行尾
N-M 在N~M的范围内
-M 从第一个字节,字符,字段到第M个(包括M)个字节,字符或者字节.
#$cat range_fields.txt
abcdefghijklmopqrstuvwxyz
abcdefghijklmopqrstuvwxyz
abcdefghijklmopqrstuvwxyz
abcdefghijklmopqrstuvwxy
#$cut -c1-5 range_fields.txt 显示c后5个字符
abcde
abcde
abcde
abcde
#$cut range_fields.txt -c-2 显示c前两个字符
将-c 替换成-b,可以用字节作为计数单位 在使用-c ,-f ,-b 时可以指定输出定界符
--output-delimiter “delimiter string”
当用-b或者-c提取多个字段时,必须使用—output-delimiter
#$cut range_fields.txt -c1-3,6-9 –output-delimiter “,”
abc,fghi
abc,fghi
abc,fghi
abc,fghi
13.统计词频
sed stream editor流编辑器
#$sed 's/pattern/replace_string/' file
#$cat file | sed 's/pattern/replace_string/' file
#$sed -i 's/text/replace/' file 使用-i选项,可以将替换结果应用于源文件
#$sed 's/pattern/replace_string/g' file 替换所有内容
#$echo this thisthisthis | sed 's/this/THIS/2g'
this THISTHISTHIS
#$echo this thisthisthis | sed 's/this/THIS/3g'
thisthisTHISTHIS
#$echo this thisthisthis | sed 's/this/THIS/4g'
thisthisthisTHIS
从第N处匹配开始替换时,可以用/Ng
字符/ 在sed中作为定界符使用,也可以使用其他任意的定界符
sed 's:text:replace:g'
sed 's|text|replace|g' 如果定界符出现在样式内部,需要\转义
sed 's|te\|xt|replace|g'
#$sed '/^$/d' file 移除空白行
#$sed 用&标记匹配样式的字符串
#$echo this is an example | sed 's/\w\+/[&]/g' 正则表达式匹配单词\w\+ ,替换[&]
[this] [is] [an] [example]
#$echo this is digit 8 in a number | sed 's/digit \([0-9]\)/\1/'
this is 7 in a number
#$echo seven EIGHT | sed 's/\([a-z]\+\) \([A-Z]\+\)/\2 \1/'
EIGHT seven
([a-z]\+\) 匹配第一个单词 ([A-Z]\+\) 匹配第二个单词 \1 \2 引用它们,这种引用叫向后引用
14.awk 操作数据流的列和行
awk 用于数据流对列和行进行操作
awk ' BEGIN{ print “start” } pattern { commands } END{ print “end” }
file awk由三部分组成,BEGIN,END语句块和使用模式匹配的通用语句块 是可选的,脚本包含在单引号或者双引号中
#$awk 'BEGIN { i=0 } { i++ } END{ print i}' filename 或者
#$awk “BEGIN { i=0 } { i++ } END{ print i}” filename
#$echo -e “line1\nline2” | awk 'BEGIN{ print “start” } { print } END{ print “end” }
start
line1
line2
end
当不指定pattern时,默认就是打印.print的参数是以逗号进行分割时,参数打印时则以空格作为定界符,在awk的print语句中,双引号是被作为凭借操作符(concatenation opeartor) 使用的
#$echo | awk '{ var1=”v1”; var2=”v2”; var3=”v3”; print var1,var2,var3 ; }'
v1 v2 v3
#$echo | awk '{ var1=”v1”; var2=”v2”; var3=”v3”; print var1”-”var2”-”var3 ;}'
v1-v2-v3
awk 的特殊变量 NR 记录数量,在执行过程中对应于当前行号, NF 字段数量,在执行过程中对应于当前行的字段数 $0 包含执行过程中当前行的文本内容
$1 包含第一个字段的文本内容
$2 包含第二个字段的文本内容
#$awk '{ print $3,$2 }' file 打印每一行的第2和第3个字段
#$awk 'END{ print NR }' file 统计文件中的行数
-v 将外部值传递给awk
#$var=10000
#$echo | awk -v variable=$var'{ print variable }'
getline 读取一行的var内容 getline var
#$awk 'NR < 5' #行号小于5的行
#$awk 'NR==1,NR==4' #行号在1到5之间的行,(从0开始的)
#$awk '/linux/' #包含样式linux的行
#$awk '!/linux/' #不包含样式linux的行
设置字段定界符 默认是空格 用-F “delimiter” 指定
#$awk -F: '{ print $NF }' /etc/passwd 或者
#$awk 'BEGIN { FS=”:” } { print $NF }' /etc/passwd 在begin语句块中用OFS=”delimiter” 设置输出字段的定界符
awk中使用循环 for(i=0;i<10;i++){ print $i; } 或者
for (I in array ){ print array[i];}
awk内建的字符串控制函数
length(string) 返回字符串的长度
index(string,search_string) 返回search_string在字符串中出现的位置
split(string,array,delimiter) 用定界符生成一个字符串列表,并将该列表存入数组
substr(string,start-position,end-position) 在字符串中用字符起止偏移量生成子串,并返回该子串
sub(regex,replacement_str,string) 将正则表达式匹配到的第一处内容替换成repalcement_str
gsub(regex,replacement_str,string) 和sub类似,不过会替换正则表达式匹配到的所有内容
match(regex,string) 检查正则表达式是否能够匹配字符串,返回非0值. 否则返回0 ,有两个特殊的变量,RSTART和RLENGTH 表示包含正则表达式所匹配内容的起始位置和包含正则表达式所匹配内容的长度
15. 服务器管理
ps top pgrep
#ps 显示当前终端TTY的进程
#ps -f 更多消息 -e (every) -ax(all) 获取运行在系统中的每一个进程的信息
#ps -e 或者#ps -ef 或者 #ps -ax #ps -axf
#ps -e | head用head过滤 打印前10项
-o 参数,参数,参数 用,定界符且没有空格 指定想要显示的列
#$ps -eo comm,pcpu | head 其中comm标示command,pcpu表示cpu占有率
参数有
pcpu cpu占用率
pid 进程id
ppid 父进程id
pmem 内存使用率
comm 可执行文件名
cmd 简单命令 simple command(简单命令是由空白字符分割的一系列单词,以shell控制操作符作为结尾. 第一个单词指定要执行的命令,余下的单词作为命令参数. Shell控制操作符可以是换行符,或者是 : ||,&&,&,;,;;,|,\&,(,)
user 启动进程的用户
nice 优先级(niceness)
time 累计的cpu时间
etime 进程启动后度过的时间
tty 所关联的tty设备
euid 有效用户id
stat 进程状态
#$top 默认输出一个占用cpu最多的进程列表 类似的还有atop 和ltop (没有这几个命令的需要自行安装)
根据参数对ps输出进行排序
#$ps [options] –sort –paramter1,+parameter2,parameter3...
#$ps -eo comm,pcpu –sort -pcpu | head 列出占用CPU最多的10个进程
用grep从ps的输出中提取相关的 | grep “进程名或者其他的相关参数”
找出给定命令名对应的进程ID
#$ps -C command_name -o pid= 如ps -C bash -o pid= 列出所有bash进程的所有的进程ID
pgrep 获得一个特定命令的进程ID列表
#$pgrep COMMAND -d delimiter_string 指定输出定界符
#$pgrep bash -d “:”
1255:1680
指定进程的用户(拥有者)的列表
#$pgrep -u root,slynux command 返回所匹配的进程数量
#$ps -u root -U root -o user,pcpu 显示root作为有效用户和真实用户id的所有进程,以及用户,cpu占用率
#$ps -eo cmd e 输出环境变量
#$ps -eo pid,cmd e | tail -n 3
杀死进程
#$kill -l 列出所有可用的信号
#$kill -s SIGNAL Pid 向指定的进程发送指定信号 (或者直接kill -9 PID)常用的是singal
sighup 1 对控制进程或者终端进行挂起检测
sigint 2 当按下ctrl+c时发送该信号
sigkill 9 用于强行杀死进程
sigterm 15 默认用于终止进程
sigtstp 20 当按下ctrl+z时发送该信号
#$killall process_name 杀死一组命令 = killall -9
#$killall -u username process_name 杀死用户的指定进程 如果需要确认 -i
#$pkill process_name
#$pkill -s signal process_name
trap 捕捉并相应信号
#$trap 'signal_handler_function_name' signal list 其中signal list以空格分隔,可以是信号数字或者信号名称
17.查找命令
which 找出某个命令的位置
#export PATH=$PATH:/home/test/bin 添加/home/test/bin到PATH
whereis 返回命令的路径还可以打印出命令手册的位置以及命令源代码的路径
file 确定文件的类型
whatis 输出作为参数的命令的简短描述信息
apropos command 搜索和某个单词相关的命令是否存在
uptime 或者平均负载 第一个值1分钟内的平均值 第二个5分钟的平均值 第三个15分钟内的平均值
18.向终端发送消息
wall向所有当前登录用户的终端写入消息 因为终端是作为设备存在的,在/etc/pts都有对应的设备节点文件
#$cat message | wall 或者#$wall < message
19.收集系统信息
#$hostname 打印当前系统的主机名
#$uname -n 打印内核版本 硬件架构等 -a 打印内核发行版本 -r 打印主机主机类型 -m 打印出cpu的相关信息
#$cat /proc/cpuinfo 获取处理器名称 #$cat /proc/cpuinfo | head -n 5 | tail -1 (cpuinfo的第5行包含处理器的名称,提取出前5,再提取最后一行)
#$cat /proc/meminfo 打印内存的详细信息
#$cat /proc/meminfo | head -l 打印可用内存总量
#$cat /proc/partitions 打印系统分区信息 或者 #$fdisk -l
获取系统的详细信息 lshw
/proc 收集信息
bash的进程id 加入是4295 (pgrep bash) 系统每个运行的进程都在/proc中都有一个对应的目录,进程的目录名和进程ID相同,这个目录包含了大量的相关进程的信息
cat /proc/4295/envion 显示所有传递给该进程的环境变量
exe 是一个到进程工作目录的符号链接
#$readlink /proc/4295/exe
/bin/bash
fd 包含了由进程所使用的文件描述符
20.让进程后台运行 ,在命令后加上 & 把命令放入一个作业队列中
查看后台进程 jobs -l
对已经在前台执行的命令,也可以重新放到后台执行,首先ctrl+z (不是ctrl+c中断)暂停已经运行的进程,然后使用bg命令将停止的作业放到后台运行
$ ./tesh.sh
[1]+Stopped ./test.sh
$bg %1
[1]+./test.sh &
$jobs -l
[1]+22794 Running ./test.sh &
但是如上方到后台执行的进程,其父进程还是当前终端shell的进程,而一旦父进程退出,则会发送hangup信号给所有子进程,子进程收到hangup以后也会退出。如果我们要在退出shell的时候继续运行进程,则需要使用nohup忽略hangup信号,或者setsid将将父进程设为init进程(进程号为1)
$ echo $$
21734
$ nohup ./test.sh &
[1] 29016
$ ps -ef | grep test
515 29710 21734 0 11:47 pts/12 00:00:00 /bin/sh ./test.sh
515 29713 21734 0 11:47 pts/12 00:00:00 grep test
$ setsid ./test.sh &
[1] 409
$ ps -ef | grep test
515 410 1 0 11:49 ? 00:00:00 /bin/sh ./test.sh
515 413 21734 0 11:49 pts/12 00:00:00 grep test
面的试验演示了使用nohup/setsid加上&使进程在后台运行,同时不受当前shell退出的影响。那么对于已经在后台运行的进程,该怎么办呢?可以使用disown命令:
1
2
3
4
5
6
7
8
9
10
11
$ ./test.sh &
[1] 2539
$ jobs -l
[1]+ 2539 Running ./test.sh &
$ disown -h %1
$ ps -ef | grep test
515 410 1 0 11:49 ? 00:00:00 /bin/sh ./test.sh
515 2542 21734 0 11:52 pts/12 00:00:00 grep test
另外还有一种方法,即使将进程在一个subshell中执行,其实这和setsid异曲同工。方法很简单,将命令用括号() 括起来即可:
1
2
3
4
5
$ (./test.sh &)
$ ps -ef | grep test
515 410 1 0 11:49 ? 0:00:00 /bin/sh ./test.sh
515 12483 21734 0 11:59 pts/12 00:00:00 grep test
注:这部分试验环境为Red Hat Enterprise Linux AS release 4 (Nahant Update 5),shell为/bin/bash,不同的OS和shell可能命令有些不一样。例如AIX的ksh,没有disown,但是可以使用nohup -p PID来获得disown同样的效果。
还有一种更加强大的方式是使用screen,首先创建一个断开模式的虚拟终端,然后用-r选项重新连接这个虚拟终端,在其中执行的任何命令,都能达到nohup的效果,这在有多个命令需要在后台连续执行的时候比较方便:
1
2
3
4
5
6
7
8
$ screen -dmS screen_test
$ screen -list
There is a screen on:
27963.screen_test (Detached)
1 Socket in /tmp/uscreens/S-jiangfeng.
$ screen -r screen_test
21.cron 调度
cron 表由6部分组成
分钟 小时 天 月份 工作日 命令
* 星号指定某个命令实例所要执行的时间
(“5,10” 在第5分钟和第10分钟运行命令)
特定时间运行命令 */5 每5分钟运行一次命令
02 * * * * /home/user/test.sh 这个cron作业会每天每个小时的第2分钟执行脚本
00 5,6,7 * * /home/user/test.sh 这个corn作业会在每天的第5,6,7小时执行脚本
00 */12 * * 0 /home/user/test.sh 在周日的每个小时执行脚本
00 02 * * * /sbin/shutdown -h 在每天凌晨2点钟关闭计算机
调度cron作业 手动运行crontab 用选项-e 输入cron作业
crontab -e
02 02 * * * /home/test.sh
然后就会进入vi供用户输入cron作业并且保存,然后这个作业会在指定时间调用
或者crontab task.cron 创建一个文本文件task.cron并且写入cron作业
crontab<<EOF 在行内inline指定cron作业
02 * * * * /home/user/test.sh
EOF
cron作业需要写在crontab<<EOF和EOF之间 (注意cron作业使用的权限同执行crontab命令所使用的权限同,在cron命令中指定的命令需要使用完整路径,因为cron的作业环境与终端的环境变量PATH的不一样)
cron表插入一行变量赋值语句来设置环境变量
比如用代理链接internet
crontab<<EOF
http_proxy=http://192.168.0.3:3128
00 * * * * /home/download.sh
EOF
查看cron表
crontab -l
查看指定用户名的cron表
crontab -l -u user
移除当前用户的cron表
crontab -r
移除指定用户的cron表
crontab -u user -r
22.网站下载
wget url1 url2 url3 … -O 指定输出名 -o 写入日志
wget -t 重试次数 url 中断后尝试次数
下载限速 wget –limit-rate 20k url k或者m
下载限制最大下载配额quota wget -Q 100m url 或者用—quota
断点续传 wget -c url
curl下载 不是将下载数据写入文件,而是写入标准输出stdout,所以需要重定向stdout到文件
复制或者镜像整个网站
wget –mirror url 或者 wget -r -N -1 depeth url 其中-1 是指定的页面层级深度 -r是递归 -N允许对文件使用时间戳.
访问需要http或者ftp的认证页面
wget –user username –paswword pass url
也可以改成需要网页提示并且手动输入密码 –password 改成 –ask-password
23.命令行的web浏览器
lynx -dump url>webpage_as_text.txt (以ascii字符下载到文本中) 这会把所有的超链接(<a href=”link”>) 作为文本输出的页脚列在reference标题之下
curl 将下载文件输出到stdou,将进度信息输出到stderr,如果不想显示进度信息,需要用—slient
curl url –silent
24.网络
ifconfig 位于/sbin/ifconfig 需要加入/sbin为环境变量
ifconfig | cut -c-19 | tr -d ' ' | tr -s '\n' 打印系统可用的网络接口列表
#ifconfig wlan0 ip 设置wlan0的ip地址
ifconfig eth0 hw ether 00:00:11:22:33 修改mac地址
添加域名服务器
#echo nameserver ip_address >> /etc/resolv.conf
dns查找
host 域名
nslookup 域名
route 路由表
route -n 设置默认网关 route add default gw ip_address interface_name
比如 #route add default gw 192.168.0.1 wlan0
traceroute 域名 跟踪跳hop
lsof -i 列出系统中的开放端口以及运行在端口上的服务的详细信息
netstat 查看开放端口和服务
查看网络流量watch -n 1 "/sbin/ifconfig eth0 | grep bytes"
25.磁盘du filename 查找某个文件占用的磁盘空间 df = disk free du=disk usagedu -a directory 递归输出指定目录或者多个目录所有文件的统计结果du -b 用字节单位 -k 以KB为单位 -m 以MB为单位 -B 以块为单位 如果要排除 用—exclude “文件”找出指定目录中最大的10个文件#$du -ak source_dir | sort -nrk 1 | head