第一章 小试牛刀
echo 后面可以直接跟内容,或者用单引号和双引号
1.单引号中的变量不会被解析,比如echo '$aa' 结构就是 $aa
2.不带引号时,echo hello;hello 的第二个hello会被当做命令执行
echo -n 忽略换行
echo -e 输出的内容会被转移
printf
%-5s 打印字符串,- 表示左对齐,不到5位的用空格替代
$s格式化字符串,%c是替换字符,%d是数字,%f是浮点数
输出带色彩的文件和背景
echo -e "\e[1;45m \e[1;31m sssssssssssssss \e[0m"
变量的一些简单实用
var=hello
输出var变量
echo $var
echo ${var}
求字符串长度
echo ${#var}
当前的shell版本
echo $SHELL
echo $0
数学运算
let var++ #执行let时候变量前面不需要加$符号
echo $var
result=$[no1 + no2] #[]中也可以使用$前缀
result=$[$no1 + 5]
result=$(( no1 + 5 )) #()这种写法时,变量前必须加上$
echo "4*3.14" | bc #只有bc才支持浮点运算
调用一个shell有两种方式,调用一个shell执行然后得到它的返回值
result=`expr 3+4`
result=$(exprt $no1+5)
输入输出
0 stdin(标准输入)
1 stdout(标志输出)
2 stderr(标志错误)
> 等同于1>; >>等同于1>>
echo "hello " 2>&1 out.log
echo "hello" &> out.log
自定义文件描述符(注意 > 符号和数字之间不能有空格)
echo "this is new line" > input.txt
exec 3<input.txt
cat <&3
exec 4 > out.txt
echo "new line" >& 4
exec 5>>input.txt
echo "append" >&5
echo "aaa" 2> /dev/null #错误输出重定向到黑洞文件
数组
array_var=(1,2,3,4,5,6)
array_var[0]="test1"
array_var[1]="test2"
array_var[2]="test3"
echo $(array_var[0])
echo $(array_var[$index]) #假设index=5
echo $(array_var[@])
结果: test1 test2 test3 test4 test5 test6
echo $(#array_var[*]) #打印数组长度
关联数组
declare -A ass_array
ass_array=(([index1]=val-1 [index2]=val-2))
或者:
ass_array[index1]=val-1
ass_array[index2]=val-2
fruits_value=( [apple]='100 dollars' [orage]='150 dollars' )
列出数组索引
echo $(!array_var[*])
echo $(!array_var[@])
语法 描述
${!array[*]} 取关联数组所有键
${!array[@]} 取关联数组所有键
${array[*]} 取关联数组所有值
${array[@]} 取关联数组所有值
${#array[*]} 关联数组的长度
${#array[@]} 关联数组的长度
别名
alias rm='cp $@ ~/backup; rm $@'
可以将其放入到 ~/.bashrc文件中,新的shell进程就会生效,删除可以从这个文件中删除或者使用
unalias命令
时间
sleep 秒
usleep 微妙(百万分之一秒)
date,格式化字符串
星期 %a(简写) %A(完整)
月 %b(简写) %B(完整)
日 %d
年 %y(两位表示) %Y(四位表示)
小时 %H
分钟 %M
秒 %S
纳秒 %N
时间戳 %s
调试
sh -x script.sh
set -x: 在执行时显示参数和命令
set +x: 禁止调试
set -v: 当命令进行读取时显示输入
set +v: 禁止打印输入
function DEBUG() {
[ "$_DEBUG" == "on" ] && $@ || :
}
可以将调试功能设置为on来运行脚本
_DEBUG=ON ./scritp.sh
DEBUG函数中的 : 告诉shell不要执行任何操作
把 #! /bin/bash 改成 #! /bin/bash -xv 这样不用其他任何选项就可以启用调试功能了
函数
调用函数方式
myfun ;
传递参数
myfun arg1 arg2 ;
参数可以传递给脚本并通过$0(脚本名) 访问
$1 第一个参数
$2 第二个参数
$n 第n个参数
$@ 被扩展成 "$1" "$2" "$3" 等
$* 被扩展成 "$1c$2c$3"等
$@用的最多,由于$*将所有参数当做单个字符串因此很少被使用
导出函数,之后函数的作用域就可以扩展到子进程中
export -f myfun
读取命令返回值(状态)
cmd;
echo $?
利用()可以生成子shell,子shell中执行的内容不会对父shell产生影响
pwd;
(cd /bin; ls)
从控制台读取
read -n number_of_chars variable_name #从输入中读取n个字符并存入变量variable_name中
read -s var #用不回显的方式去读密码
read -p "enter input :" var # 显示提示信息
read -t timeout var #在特定的时间内读取输入read -t 2 var 两秒内输入
read -d delim_char var #用定界符结束输入行 read -d ":" var
#输入hello: var被设置为hello
分隔符
读取/etc/passwd,打印出用户默认的shell
line="root:x:0:0:root:/root:/bin/bash"
oldIFS=$IFS
IFS=":"
count=0
for item in $line;
do
[ $count -eq 0 ] && user=$item;
[ $count -eq 6 ] && shell=$item;
let count++
done;
IFS=$oldIFS
echo $user\'s shell is $shell
结果: root's shell is /bin/bash
echo {1..50} #能够生产从1到50的数字列表
echo {a..z}或者{A..Z},或者使用{a..h}生产部分列表
for i in {a..z} do action; done;
for循环
for var in list;
do
command;
done
采用c语言中的for循环格式
for((i=0;i<10;i++)) {
commands;
}
while循环
while condition
do
command;
done
用true作为循环条件能够参数无限循环
until循环(它会一直执行循环直到给定的条件为真)
x=0;
unitl [ $x -eq 9 ];
do
let x++;
echo $x;
done
比较
if condition;then
commands;
fi
if condtion;then
commands;
elif condtion;then
commands;
else
commands;
fi
条件通常被放置在封闭的中括号内,一定要注意在[或]与操作数之间有一个空格,如果忘记空格脚本就
会报错
一些重要的操作符:
-gt 大于
-lt 小于
-ge 大于或等于
-le 小于或等于
-eq 等于
-nq 不等于
文件系统相关测试
[ -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 ]
[[ -z $str1 ]] #如果str1包含的是空字符串,则返回真
[[ -n $str1 ]] #如果str1包含的是空字符串,则返回真
第二章 命令之乐
cat相关
cat file1 file2 file3 #将多个文本内容拼接在一起
OUTPUT_FROM_SOME COMMANDS | cat #从表中输入中读取
echo 'from stdin' | cat - file.txt
cat -s file #压缩空白行
cat -T file.py #将制表符显示为 ^|
cat -n file.txt #显示行号
录制和回放终端会话
script
scriptreplay
文件查找
find base_path #base_path 可以是任何位置
-print 指明打印出匹配的文件名(路径)
-print0 指明使用'\0'作为定界符来打印每一个匹配的文件名
-name 后面的参数可以包含正则表达式,指定了文件名所必须匹配的字符串
-iname 类似-name,但是忽略大小写,如果有多个匹配条件可以用OR,也可以用!否定参数的含义
find . \(-name "*.txt" -o -name "*.pdf" \) -print
find . ! -name "*.txt" -print #打印所有不以.txt结尾的文件
-regex 支持正则表达式
-iregix 忽略大小写
find . -iregex ".*\(\.py\|\.sh\)$" #忽略大小写找到所有py和sh结尾的文件
-maxdepth 深度搜索,最多搜索多少层
-mindepth 深度搜索,最少搜索多少层
find . -maxdepth 1 -type f -print #从性能角度来说,最好先指定深度再确定类型
-type 搜索文件类型
普通文件 f
符号链接 l
目录 d
字符设备 c
块设备 b
套接字 s
fifo p
-atime 用户最近一次访问文件的时间,可以带上 + 和 - 表示大于和小于
-mtime 文件内存最后一次被修改的时间
-ctime 文件元数据(metadata,列如权限 或所有权)最后一次改变的时间
find . -type f -atime -7 print #打印出最近七天内被访问过的所有文件
find . -type f -atime 7 print #打印出恰好在七天前被访问过的文件
find . -type f -atime +7 print #大餐饮出访问时间超过七天的所有文件
-amin 访问时间,以分钟为单位
-mmin 修改时间,以分钟为单位
-cmin 变化时间,以分钟为单位
find . -type f amin +7 -print #打印出访问时间超过7分钟的所有文件
-newer 指定一个用户比较时间长的参考文件,然后找出比参考文件更新的(更长修改时间)文件
find . -tpe f -newer file.txt -print
-size 根据文件大小搜索
b 块(512字节)
c 字节
w 字(2字节)
k 千字节
M 兆字节
G 吉字节
find . -type f -size +2k #大于2k的文件
-delete 用来删除find查找到的匹配文件
find . -type f -name "*.swp" -delete #删除当前目录下所有.swp文件
-perm 根据文件权限和所有权查找(-user 可以指定用户)
find . -type f -perm 644 -print #打印出权限位644的文件
find . -type f -user testuser -print #打印出所有testuser用户的文件
-prune 跳过指定的目录
find /data0/source_path \( -name ".git" -prune \) -o \( -type f -print \) #忽略git文件
-exec 可以与其他命令结合(但是只能执行一个命令)
find . -type f -user root -exec chown testuser {} \;
#上面的语句是找到所有root所有者的文件修改为testuser,对于每一个匹配的文件{}会被替换成
#相应的文件名,如果找到两个文件file1.txt和file2.txt那么会执行
chown testuser file1.txt
chown testuser file2.txt
find . -type f -name "*.c" -exec cat {} \;>all_c_files.txt
#上面的命令是将所有c程序文件拼接起来写入单个文件all_c_files
find . -type f -mtime +10 -name "*.txt" -exec cp {} OLD \;
#上面的命令将10天前的.txt文件复制到OLD目录中
find . -type f -exec ./commands.sh {} \;
#虽然-exec 参数无法使用多个命令,但是可以执行一个脚本,在脚本中放入多个命令
find . -type f -name "*.txt" -exec printf "Text file : %s\n" {} \;
#-exec能够同printf结合起来生产有用的输出信息
玩转xargs
xargs命令把从stdin接收到的数据重新格式化,再将其作为参数提供给其他命令
-n 参数表示将输入的内容转换为指定的行
cat example.txt | xargs -n 3 #将example.txt的内容转换为3行
-d作为定界符
echo "splitXsplitXsplitXsplit" | xargs -d X -n 2
#结果: split split
split split
假设args.txt内容如下:
arg1
arg2
arg3
-I选项指定一个替换字符串,这个字符串在xargs扩展时会被替换掉。当-I与xargs结合使用时,
对于每一个参数,命令都会被执行一次
cat args.txt | xargs -I {} ./echo.sh -p {} -x
结果为:
./echo.sh -p arg1 -x
./echo.sh -p arg2 -x
./echo.sh -p arg3 -x
用tr进行转换
tr 输入部分 [需要转换的部分] [转换后的部分]
echo "hello world hehe 1234 aa" | tr 'a-z' 'A-Z'
#结果: HELLO WORLD HEHE 1234 AA
压缩字符
echo "gun is not unix " | tr -s ' ' #将连续的字符压缩成单个字符
删除
echo "hello world hehe 1234 aa" | tr -d '0-9'
#结果: hello world hehe aa
补集,比如下面这个列子,将不在 0-9,空格,回车中的字符全部删除
echo hello 1 char 2 next 4 | tr -d -c '0-9 \n'
#结果: 1 2 4
校验和核实
md5sum file #创建一个文件的指纹,并将字符串打印到控制台上
md5sum file > check.md5
#生成的内容
65466125197978378ec6340989ac50db check.log
md5sum -c check.md5 #对文件进行校验
sha1sum file #创建一个文件的指纹,并将字符串打印到控制台上
sha1sum file > check.sha1
#生成的内容
3acec0d3b6e19f68c4d25de104eabb25d5c982d2 checkfile.log
sha1sum -c check.sha1 #对文件进行校验
排序
sort -n 按数字进行排序
sort -r 逆序排序
sort -M 按照月份排序,一月,二月,三月这样的顺序
sort -C 测试一个文件是否已经被排序过
sort -m sorted1 sorted2 合并两个排序过的文件,而且不需要对合并后的文件再进行排序
sort -k 指定了排序应该按照哪一个键来排序
sort -b 忽略文件中的前导空白字符
sort -d 按照字典排序
sort -o file.log 将排序结果输出到指定文件中
sort -u 文件去重
#用法
sort -C file
if [ $? -eq 0 ];then
echo sorted
else
echo unsorted
fi
单一与重复
uniq命令可以消除重复的内容,但必须用于排序过的数据,一般和sort命令结合使用
uniq -u sorted.txt 只显示唯一的行(在输入文本中没有出现重复的行)
uniq -c sorted.txt 统计各行在文件中出现的次数
uniq -s 2 sorted.txt 指定可以跳过前N个字符
uniq -w 2 sorted.txt 指定用于比较的最大字符串
uniq -z file.txt 为每行最后添加\0值字符
临时文件与随机数
echo $RANDOM #每次都会返回一个随机数
temp_file="/tmp/file-$RANDOM"
tmpe_file="/tmp/var.$$" # $$表示当前进程的id
文件分割
split -b 10k data.file
ls
#结果为: data.file xxa xab xac ... axj xa开头的一共10个文件
split -d 指定数字为后缀
split -a 4 指定后缀长度
split -b 10k data.file -d -a 4
split [command_args] prefix 分割的文件前缀
根据扩展名切分文件名
file_jpg="sample.jpg"
echo ${file_jpg%.*} #输出sample
echo ${file_jpg#*.} #输出jpg
${VAR%.*} 表示删除位于%右侧的通配符(也就是 .* ),通配符从右向左进行匹配 这种是非贪婪形的
${VAR%%.*} 从右向左执行贪婪操作匹配
file=hack.fun.book.txt
${file%%.*} 输出为hack
${VAR#*.} 是从左向右匹配,删除位于#右侧的通配符(也就是 *. )
${VAR##*.} 是贪婪匹配,从左向右删除变量中匹配的结果
file=hack.fun.book.txt
${file##*.} 结果是txt
批量重命名和移动
count=1;
for img in *.jpg *.png
do
new=image-$count.${img##*.}
mv "$img" "$new" 2> /dev/null
if [ $? -eq 0 ];then
echo "renaming $img to $new"
let count++
fi
done
第三章 以文件之名
生成任意大小的文件
dd if=/dev/zero of=/junk.data bs=1M count=1
if是input file
of是output file
bs是block size
count代表需要被复制的块数
块的大小定义如下:
字节(1B) c
字(2B) w
块(512B) b
1k k
1m M
1g G
文件的交集与差集
cat a.log
apple
gold
iron
orange
silver
steel
cat b.txt
carrot
cookies
gold
orange
comm a.log b.log
结果:
apple
carrot
cookies
gold
iron
orange
silver
steel
第一列是只在a.log中出现的
第二列是只在b.log中出现的
第三列是同时在a.log和b.log中出现的
comm a.log b.log -1 #删除第一列
comm a.log b.log -2 #删除第一列
comm a.log b.log -3 #删除第一列
comm a.log b.log -1 -2 #删除第一和第二列
查找并删除重复文件
#! /bin/bash
ls -lS | awk 'BEGIN{
getline;getline
size=$5; lastName=$9
}
{
currentName=$9
if(size==$5) {
"md5sum "lastName | getline; csum1=$1;
"md5sum "currentName | getline; csum2=$1;
if(csum1==csum2) {
print lastName
print currentName
}
};
size=$5
lastName=currentName
} ' | sort -u > dup_file
cat dup_file | xargs -I {} md5sum {} | sort | uniq -w 32 | awk '{ print $2 }' | sort -u > dup_sample_file
comm dup_file dup_sample_file -2 -3 | tee /dev/stderr | xargs rm
#首先获得文件列表然后遍历并按大小排序,获取文件大小和文件名,如果文件大小相同再比较两个文件
#的MD5值。如果MD5值相同那么肯定是重复的文件,把这两个文件名打印出来,最后重定向到dup_file中
#之后cat这个文件再对每行(也就是每个重复的文件)计算MD5值并排序(只比较前32个字节),最后去重
#只打印一个重复的文件并重定向到dup_sample_file中
#最后用comm比较dup_file和dup_sample_file,打印出只在dup_file中出现的文件,并用tee打印到标准
#错误输出中,最后交给xargs 删除这些文件
#其中上面的功能只需要一行就可以完成了
ll | awk 'BEGIN{getline} {print $9}' | xargs -I {} md5sum {} | uniq -w 32 -D | awk 'BEGIN{getline}{print $2}' | xargs -I {} rm {}
#awk中的getline是读取一行,ll的第一行内容不需要所以只读取然后忽略即可,之后用对每个文件做
#MD5,然后比较前32个字节,打印出所有重复的文件名,之后再用awk,忽略掉第一行(从第二行开始读)
#然后交给xargs最后删除这些重复文件
文件权限 所有者和粘滞位
ls的第一位
- 普通文件
d 目录
c 字符设备
b 块设备
l 符号链接
s 套接字
p 管道
之后是9个权限位rwxrwxrwx,用户,组,其他
对于用户来说有一个suid位,-rwS------ setuid权限允许用户以其他拥有者的权限来执行可执行文件
对于组用户有一个sgid位,----rwS--- setgid位允许以同该目录拥有者所在组相同 的有效组权限来执行文件
目录有一个特殊权限,叫粘滞位。当一个目录设置了粘滞位,只有创建该目录的用户才能删除目录中的文件,即使其他用户和组用户有权限也不行。
粘滞位出现在其他用户执行的执行权限位置(x),使用t或者T表示,如果没有设置执行权限,但设置了粘滞位则使用t表示;如果同时设置了执行权限和粘滞位就使用T表示
chmod a+t directory_name #设置粘滞位
chmod 777 . -R #递归执行
chmod +s executeable_file #设置sid位
批量生成空文件 创建不可修改文件
touch file
for name in {1..100}.txt
do
touch name
done
touch -a 只更改改文件的访问时间(access time)
touch -m 只更改文件内容修改时间(modification time)
touch -d 为文件指定特定的时间戳
touch -d "Jan 20 2010"
chattr -i file #设置不可删除的文件
查找符号链接及指向
ll | grep "^l" | awk '{print $9 " " $10 " " $11}'
find -type l | xargs readlink
列举文件类型统计信息
#遍历一个目录下的文件类型,并打印出这种文件类型出现的次数
#下面这段代码是书中提供的,但是有问题不知道如何修改
#! /bin/bash
if [ $# -ne 1 ];then
echo $0 bashpath;
echo
fi
path=$1
declare statArray
find $path -maxdepth 1 -print | while read line
do
ftype=`file -b $line`
let "statArray[$ftype]"++ ;
done
for ftype in "${!statArray[@]}"
do
echo $ftype : ${statArray["$ftype"]}
done
#上面的功能用一行就看以完成了
find /root -maxdepth 1 -print | xargs -I {} file -b {} | awk '{sum[$0]++} END{ for(i in sum){print i "\t" sum[i]} }'
环回文件与挂载
dd if=/dev/zero of=loopback.img bs=10m count=1
mkfs.ext3 loopback.img
sudo mkdir /mnt/loopback
mount -o loop lopback.img /mnt/loopback
mount -t ext4 /dev/sdb1 /data1 #挂载一个分区
文件补丁
diff version1.txt version2.txt
#显示差异
#-u用做生成一体化输出,并将结果重定向到patch文件中
diff -u version1.txt version2.txt > version.patch
#给version1打补丁后就变成了version.txt
patch -p1 version1.txt < version.patch
#再打一次补丁就还原回version1了,此时会出现是提示,是否需要继续执行
patch -p1 version1.txt < version.patch
head和tail
head file #默认打印前10行
head -n 5 file #打印前5行
head -n -5 file #打印除了最后5行外的所有行
tail file #打印最后10行
tail -n 5 file #打印最后5行
tail -n +5 file #打印除了前5行外的所有行
seq 100 | tail -n +20 #seq 100 会打印出1到100个数字,每打印一次会换行
dmegs | tail -f
PID=${pidof Foo}
tail -f file --pid $PID #当进程Foo结束后,tail也会跟着结束
只列出目录
ls -D
ls -F #对于目录会增加/ 结尾,对于文件增加 * 结尾
ls -F /home | grep "/$" #查找/home目录的所有文件,以/ 结尾的
ls -l /home | grep "^d"
find /home -type d -maxdepth 1 -print
在命令行中用pushd和popd快速定位
pushd可以在多个目录中快速的定位
pushd /data0/test/mydir
pushd /home/hehe/test
pushd /var/log/test
pushd /test/dir
位置从0开始
dirs /test/dir /var/log/test /home/hehe/test /data0/test/mydir
pushd +0 就是/test/dir表示在这个目录不动
pushd +1 就是切换到/var/log/test
popd 是弹出最上面的目录
popd +n 弹出第n个目录,它也是从下标0开始计算的
popd +1 表示弹出/var/log/test
如果只有两个目录/data0/test和/home/hehe
先cd到/data0/test再cd到/home/hehe
如果想切回到/data0/test
执行cd - 即可,再切换到/home/hehe,再执行一次 cd -
不停的执行cd - 就可以在两个目录之间切换了
统计文件的行数 单词数和字符数
wc -l file #统计行数
wc -w file #统计单词数
wc -c file #统计字符数
wc file #打印出文件的行数,单词数和字符数
wc file -L #打印最长行的长度
打印目录树
tree
tree -P "*.jpg" #用通配符描述样式
tree -L [path] #指定递归的目录深度
tree --inodes #列出文件并显示这个文件的inode
tree -d [path] #只显示目录
tree -s [path] #列出文件并显示大小(字节)
tree -D [path] #列出文件并显示修改时间
tree -H [path] #以HTML格式打印
tree -o file [path] #结果重定向到文件中
第四章 让文本飞
正则表达式
^ 行起始标记 ^tux 匹配以tux起始的行
$ 行尾标记 tux$ 匹配以tux结尾的行
. 匹配任意一个字符 Hack.匹配Hack1和Hacki,但是不匹配Hackl2和Hackil
[] 包含在[]之中任意字符 cook[kl]匹配cook或cool
[^] 匹配除^之外任意字符 9[^01]匹配92,93但是不匹配91或90
[-] 匹配[]中指定范围任意字符 [1-5]匹配从1~5的任意一个数字s
? 匹配之前的项1次或0次 colou?r 匹配color或者colour,但不能匹配colouur
+ 匹配之前的项目1次或多次 Rollno-9+ 匹配Rollno-99,Rollno-9
* 匹配之前的项0次或多次 co*l匹配cl,col,coool等
() 创建一个用于匹配的字串 ma(tri)? 匹配max或maxtrix
{n} 之前的项匹配n次 [0-9]{3}匹配任意一个三位数,[0-9][0-9][0-9]
{n,m} 指定之前的项所必须匹配的最小和最大次数 [0-9]{2,5}匹配从两位数到五位数之间任意一个
| 交替--匹配 | 两边任意一项 Oct(1st|2nd) 匹配Oct1st或0ct2nd
\ 转移符可以将特殊字符进行转移 a\.b匹配a.b
\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 单个非单词字符 \W匹配&,但不匹配1或a
\n 换行符 \n匹配一个新行
\s 单个空白字符 X\sx匹配x x,但不匹配xx
\S 单个非空白字符 x\Sx匹配xx,但不匹配x x
\r 回车 匹配回车
#匹配一个IP地址
[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.
用grep搜索
grep match_pattern filename
grep "match_pattern" filename
echo -e "this is a wordl\ntext line" | grep word
grep "match_text" file1 file2 file3 ... #对多个文本进行搜索
grep word filename --color=auto #对输出行中重点标记处匹配到的单词
grep -E "[a-z]+" #使用扩展正则表达式
egrep "[a-z]+" #功能同上
grep -v "match_pattern" file #打印除包含match_pattern的行之外的所有行
grep -c "text" filename #统计文本或文件中包含匹配字符串的行
echo -e "1 2 3 4\nhello\n 5 6" | egrep -c "[0-9]" #统计匹配的行的数量,不是次数
grep linux -n sample.txt #打印出包含匹配字符串的行数
echo gnu is not unix | grep -b -o "not" #打印样式匹配所位于的字符或字节偏移
#结果 7:not
grep "text" . -R -n #在多级目录中对文本进行递归搜索 . 指定了当前的目录
echo "hello world" | grep -i "HELLO" #忽略大小写
grep -e "pattern1" -e "pattern2" #匹配多个样式
grep -f pattern_file filename #用-f读取一个匹配样式文件
grep "main()" . -r --include *.{c,cpp} #在目录中只递归搜索.c和.cpp文件
grep "main()" . -r --exclude "README" #在搜索中排除搜油的README文件
grep --exclude-dir #排除目录
grep --exclude-from FILE #排除所需的文件列表
grep -q #静默输出,可以用于 if [ $? -eq 0 ]; 来判断
seq 10 | grep 5 -A 3 #打印某个匹配结果之后的3行
seq 10 | grep 5 -B 3 #打印某个匹配结果之前的3行
seq 10 | grep 5 -C 3 #打印某个结果之以及之后的3行
用cut按列切分文件
cut -f FIELD_LIST filename
cut -f 2,3 filename #默认按照空格分隔,读取第二第三列
cut -d ";" #指定定界符
cut -c 1-5 range_file.txt #打印第一到第五个字符
cut -f #表示定义字符安
cut -b #表示定义字节
统计特定文件中的词频
egrep -o "[a-zA-Z]+" $filename | awk '{count[$0]} END{printf("%14s%s\n", "WORD", "COUNT")}
for(ind in count){printf("%-14s%d\n",ind,count[ind])} '
sed入门
sed 's/pattern/replace_string/' file #替换
sed -i 's/pattern/replace/' file #使用-i,可以替换原文件
sed 's/pattern/replace/g' file #替换所有处
sed '/pattern/p' #打印匹配的内容
echo this thisthisthis | sed 's/this/THIS/2g' #从第N+1处开始替换
#this THISTHISTHIS
echo this this this this | sed 's/this/THIS/3g'
#this this THIS THIS
echo this this this this | sed 's/this/THIS/4g'
#this this this THIS
#移除空白行
sed '/^$/d' # d 是删除
echo this is an example | sed 's/\w\+[&]/g' #用 & 标记匹配样式的字符串
[this] [is] [an] [example] #能够在匹配字符串时使用已匹配的内容
echo this is digit 7 in a number | sed 's/digit\([0-9]\)/\1/'
#上面这个命令将digit 7替换为7,\(pattern\) 用于匹配子串,对于匹配的第一个子串对应的标记是
# \1,匹配的第二个子串是\2,下面是包含了多个匹配
echo seven EIGHT | sed 's/\([a-z]\+\) \([A-Z]\+\)/\2 \1'
# EIGHT seven
awk入门
awk脚本的基本结构
awk 'BEGIN{ command } pattern{commands} END{ command }' file
echo | awk '{var1="v1"; var2="v2"; var3="v3"; print var1,var2,var3}'
#结果v1 v2 v3
#print var1"-"var2"-"var3
#结果v1-v2-v3
#特殊变量
NR 表示记录数量,相当于行号
NF 表示字段数量,在执行过程中对应当前的字段数
$0 当前行的文本内容
$1 第一个字段的文本内容
$2 第二个字段的文本内容
VAR=1000
echo | awk -v VARIABLE=$VAR '{print VARIABLE}' #将外部变量的值传给awk
用getline读取行
seq 5 | awk 'BEGIN{ getline; print "read ahead first line", $0} {print $0}'
#read ahead first line 1
awk 'NR < 5' #行号小于5的行
awk 'NR==1,NR==4' #行号在1到5之间的行
awk '/linux/' #包含样式linux的行
awk '!/linux/' #不包含样式linux的行
awk -F ":" '{print $NF}' file #重新设置定界符
awk 'BEGIN{FS=":"}' #同上
"command" | getline output #将command的输出读入变量output中
echo | awk '{"grep root /etc/passwd" | getline out; print out}'
#结果 root:x:0:0:root/root:/bin/bash
#在awk中使用循环
for(i=0;i<10;i++) {print $i}
for(i in array) {print array[i]}
#内建字符串
length(string) #返回字符串的长度
index(string,search_string) #返回search_string在字符串中出现的位置
split(string,array,delimiter) #用定界符生成一个字符串列表,并将结果存入数组
substr(string,star-position,end-position) #在字符串中用字符起止偏移量生成子串并返回
sub(regex,replacement_str,string) #将正则表达式匹配到第一处内容替换成replacement_str
gsub(regex,replacement_str,string) #类似上面,但是替换所有处
match(regex,string) #检查正则表达式是否能够匹配字符串,能则返回非0,否则返回0
对本文行字符迭代
while read line
do
echo $line
done < file.txt
#使用子shell方式
cat file.txt | (while read line; do echo $line; done)
#迭代一行中每一个单词
for word in $line
do
echo $word
done
#迭代一个单词中的每一个字符
for((i=0;i<$(#word);i++))
do
echo ${word:i:1}
done
按列合并文件
paste file1 file2 file3 ...
paste -d "," #列之间的定界符
打印不同行或样式之间的文本
awk 'NR==M, NR==N' filename
seq 100 | awk 'NR==4, NR==6' #打印4--6行之间的文本
awk '/start_pattern/', /end_pattern/ filename
以逆序形式打印
tac file1 file2 ...
seq 5 | tac
seq 9 | awk '{info[NR]=$0; no=NR} END{for(;no>-1;no--){print info[no}}'
解析文本中的电子邮件
grep -E -o "[A-Za-z0-9]+@[A-Za-z0-9]+\.[a-zA-Z]{2,4}" email.txt
在文件中移除包含某个单词的句子
sed 's/[^.]*mobile phones[^.]*\.//g' sentence.txt
#[^.] 可以匹配除.之外的任意字符,每个单词被//替换,注意//之间没有任何字符,也就是空字符
用awk模拟head,tail,tac
awk 'NR <= 10' filename #模拟head
awk '{buffer[N%10]=$0} END{for(i=1;i<11;i++){print buffer[i%10]} }' filename #模拟tail
awk '{buffer[NR]=$0} END{for(i=NR;i>0;i--){print buffer[i]} }' filename #模拟tac
文本切片与参数操作
var="THIS is a line of text"
echo ${var/line/REPLACE}
#结果 This is a REPLACE of text
#通过制定字符串的起始位置和长度来生成子串
${variable_name:start_pos:length}
string=abcdefghijklmnopqrstuvwxyz
echo ${string:4}
#结果 efghijklmnopqrstuvwxyz
#从第五个字符开始,打印8个字符
echo ${string:4:8}
#结果 efghijkl
#从后向前计数,最后一个字符索引记为-1,但必须放到括号内
echo ${string:(-1)}
#结果 z
echo ${string:(-2):2}
#结果 yz
检测回文字符串
#类似abbc 这样的字符
#使用sed的反向引用,p用来打印匹配内容,下面这个命令可以匹配4个字符的回文
#如abbc, \(.\) 匹配第一个字符,\2是反向引用,\1引用第一个,于是匹配abbc这样的结构
sed '/^\(.\)\(.\)\2\1/p'
第五章 一团乱麻
网站下载
wget URL1 URL2 URL3
#下载后的文件名和原始一致进度输出到stdout
wget ftp://example_domian.com/somefile.img
wget -t 5 URL #指定重试次数
wget URL -o log
wget --limit-rate 20k URL #对wget限速
wget -Q 100m URL #限制配额,最多只能下载100M
wget --quote URL #同上
wget -C URL #断点续传
wget --mirror exampledomain.com #像爬虫一样递归的收集网页上的所有URL链接
wget -r -N -l DEPTH URL # -l 指定页面层级DEPTH,这个选项需要和-r(递归)一同使用
wget --user username --password pass URL #认证
#将网页以ASCII字符形式下载到文本文件中
lynx -dump URL > webpage_text.txt
curl入门
curl URL #默认将内容输出到stdout中
curl URL > index.html
curl URL --slient #不显示进度信息
curl URL -o #将文结果写入文件,默认和URL中的文件名一致
curl URL -o index.html --progress #在下载过程中显示如 # 的进度条
curl URL/file -C offset #能够从特定的文件便宜出继续下载
curl --referer Referer_URL target_URL #如果referer是指定中的url,则跳转到那个URL中
curl URL --cookie "user-slynux;pass=hack" #指定cookie
curl URL --cookie-jar cookie_file #将cookie存入另一个文件
curl --user-agent "Mozila/5.0" #指定user-agent头
curl -H "Accept-language: en" #指定请求头
curl URL --limit-rate 20K #限制curl下载速度
curl --max-filesize bytes #指定最大下载量
curl -u user:pass URL #进行认证
curl -I URL #只返回响应头
curl -head URL #同上
curl -v #显示详细内容
第六章 B计划
用tar归档
tar -c #创建文件
tar -f #指定文件名
tar -v #详细显示
tar -t #查看
tar -x #提取归档
tar -r #追加归档
tar -rvf original.tar new_file
tar -Af file1.tar file2.tar #将file2.tar的内容合并到file1.tar中
tar -f archive.tar --delete file1 file2 ... #从归档中删除文件
tar -cf arch.tar.* --exclude "*.txt" #排除归档
tar --totals #打印归档后的总字节数
tar -u #只有比归档文件中的同名文件更新的时候才进行添加
#如 tar -uvf archive.tar filea 只有filea的文件内容修改时间更新的时候才对他添加
tar -d #打印出两者之间的差别
tar -j #指定bunzip2格式
tar -z #指定gzip格式
tar --lzma #指定lzma格式
用cpio归档
#用于将多个文件和文件夹存储为单个文件,同时还能保利麓所有的文件属性
touch file1 file2 file3
echo file1 file2 file3 | epio -ov > archive.cpio #归档
cpio -it < archive.cpio #列出归档
cpio -id < archive.cpio #从归档中提取文件
gzip压缩
gzip filename #会创建filename.gz的文件,并将原文件filename删除
gzip -l filename #列出压缩文件的属性信息
cat file | gzip -c > file #从stdin中读取并写入到stdout中
gzip --fast #最低压缩比
gzip --best #最高压缩比
gunzip filename.gz #解压缩
tar -zcvf archive.tar.gz [FILES] #创建gzip归档
tar -cvf archive.tar [FILES] #先创建归档
gzip archive.tar #再压缩
tar -ztvf archive.tar.gz #查看
tar -zxvf archive.tar.gz #提取
gzip -9 test.img # 1级最低,9级最高压缩率
zcat test.gz #直接查看压缩文件
bzip压缩
bzip2 filename #会创建filename.bz2文件,并删除原始的filename文件
cat file | gzip2 -c file.tar.bz2 #从stdin中读取并写入到stdout中
tar -jcvf archive.tar.bz2 [FILES] #创建归档
tar -cvf archive.tar [FILES] #先创建归档
bzip2 archive.tar #再压缩
tar -jtvf archive.tar.bz2 #查看
tar -jxvf archive.tar.bz2 #提取
bzip2 -9 test.img #和gzip一样从1--9级,1最快9压缩率最高
zip归档
zip archive_name.zip [SOURCE FILES/DIRS]
#如 zip file.zip file
#对目录和文件进行递归操作,和bzip2 gzip不同,zip不会删除原始文件
zip -r archive.zip folder1 file2
unzip file.zip #解压缩,不会删除原始文件
zip file.zip -u newfile #更新归档中的内容
zip -d arc.zip file.txt #从压缩归档中删除内容
zip -l archive.zip #列出归档文件中的内容
加密工具与散列
crypt <input_file> output_file
Enter passphrass: #将stdin中接收一个文件以及口令,输出到output
crpyt PASSPHRASE < input_file > encrypted_file #通过命令行参数来提供口令
crpyt PASSHRASE -d < encrypted_file > output_file #创建解密文件
gpg -c filename #加密文件
gpg filename.gpg #解密文件
base64 filename > outputfile #将文件编码为base64格式
cat file | base64 > outputfile
base64 -d file > outputfile #解码base64文件
cat base64_file | base64 -d outputfile
md5sum file #输出编码和文件名
sha1sun file #输出编码和文件名
openssl passwd -1 -salt SALT_STRING PASSWORD #利用openssl加盐散列加密
用rsync备份系统快照
rsync -av source_path destination_path #将源目录复制到目的端
rsync -a #比较进行归档
rsync -v #打印详细信息
rsync -av username@host:PATH destination #将远程机主机上的数据恢复到本地主机
rsync -z #传输时压缩数据
rsync --exclude "*.txt" #指定需要排除的文件
rsync --exclude-from FILEPATH #通过一个列表文件指定需要排除的文件
rsync -avz SOURCE DESTINATION --delete #备份时删除已不存在的文件
用dd克隆磁盘
dd if=SOURCE of=TARGET bs=BLOCK_SIZE count=COUNT
dd if=/dev/sda1 of=sda1_partition.img #将一个分区复制到文件中
dd if=sda1_partition.img of=/dev/sda1 #用备份恢复分区
dd if=/dev/zero of=/dev/sda1 #永久性删除一个分区中所有数据
dd if=/dev/sda of=/dev/sdb #在容量相同的硬盘间进行克隆
dd if=/dev/cdrom of=cdrom.iso #制作CD ROM的镜像
其他
lzma
超高压缩率的squashfs文件系统
第七章 无网不利
联网知识
#打印可用的网络接口列表
ifconfig | cut -c-10 | tr -d ' ' | tr -s '\n'
#打印eth1网卡的ip
ifconfig eth1 | grep "inet" | cut -d ":" -f 2 | awk '{print $1}'
#MAC地址欺骗
ifconfig eth1 hw enter [新的MAC地址]
HWaddr 这个是MAC地址
inet addr IP地址
Bcast 广播地址
Mask 子网掩码
分配给当前系统的名字服务器可以通过/etc/resolv.conf查看
host www.baidu.com #列出这个域名的所有IP
nslookup 域名 #类似host,会列出更多细节
route #显示路由表
route -n #指定以数字形式显示地址
traceroute 域名 #以显示分组途径的所有网关地址,用于测量源和目的经过了多少跳
ping -c 数量 域名 #发送多少ICMP包
#探测子网内所有活跃的机器,将循环体内放到 ( ) 内,可以并行执行脚本,也就是生成多个子shell,最后wait是等待
#上面的子shell执行技术
for ip in 192.168.0.1.{1..255}
do
(
ping $ip -c 2 &> /dev/null
if [ $? -eq 0 ];then
echo $ip is alive
fi
) &
wait
done
#fping可以ping一组ip
fping -a #指定打印出所有活动主机的IP
fping -u #打印出所有无法达到的主机
fping -g #指定从写作IP/mask的 "斜线--子网掩码" 记法或者起止IP地址记法中生成IP地址范围
fping -a 192.168.1/24 -g
fping -d #对每一个echo回应进行DNS查询来返回主机名
fpipng -a -d 2> /dev/null < ip.list
cat ip.list
192.168.0.86
192.168.0.9
192.168.0.6
#结果
www.local
dnss.local
传输
scp SOURCE DESTIONATION
scp user@remotehost:/home/path/filename source_filename
#递归复制
scp -r /home/slynux user@remotehost:/home/backups
scp -p #在复制文件的同时保留文件的权限和模式
SSH
ssh-keygen -t rsa
默认放到~/.ssh目录中
id_rsa.pub 是生成的公钥
id_rsa 是生成的私钥
公钥必须添加到远程服务器的 ~/.ssh/authorized_keys
#添加一个密钥,会提示要输入密码,之后就不用输入密码了
ssh USER@REMOTE_HOST "cat >> ~/.ssh/authorized_keys" < ~/.ssh/id_rsa.pub
ssh -C user@hostname COMMANDS #传输时压缩数据
网络监控
lsof -i #检测所有打开的端口
netatat -antp
第八章 当个好管家
统计磁盘使用情况
du FILENAME1 FILENAM2 ...
du -a DIRECTORY #递归的统计目录下所有的文件大小
du -h #以KB,MB,GB的方式打印大小
du -c #统计所有文件和目录综合,最后会统计总大小
du -c *.txt
du -b FILE(s) #打印字节
du -k FILE(s) #打印KB为单位的文件
du -m FILE(s) #打印MB为单位的文件
du -B BLOCK_SIZE FILE #打印以指定块为单位的文件大小
du - B 4 pcpu.sh
du --exclude "*.txt" FILE(s) #排除指定的文件
du --exclude-from EXCLUDE.txt DIRECTORY #EXCLUDE.txt包含了需要排除的文件列表
du --max-depth 2 DIRECTORY #指定最大递归深度
du -s DIRECTORY #累计指定目录总大小
#找出指定目录中最大的10个文件
du -ak DIRECTORY | sort -nrk 1 | head
find . -type f -exec du -k {} \; | sort -nrk 1 | head
df #打印磁盘目录
df -h #按照MB,GB的格式打印
计算时间
time COMMAND
real 从开始到结束的时间
user 进程再用户模式下花费的时间
sys 在内核模式下花费的时间
与当前登陆用户启动日志及启动故障的相关信息
who #获取当前登陆的相关信息
w #同who,但是更详细
users #当前登陆的用户列表
uptime #系统运行了多少时间以及平均负载
last #登陆会话信息,实际上是一个系统登陆日志,包括了tty,登陆时间状态灯信息
last -f /var/log/wtmp #明确指定日志文件
last USER #获取单个用户登陆会话信息
lastb #获取失败的用户登陆会话信息
打印历史记录中最常用的10条命令
printf "COMMAND\tCOUNT\n"; history | awk '{list[$4]++} END{ for(i in list){printf("%s\t%d\n",i,list[i])} }' | sort -nrk 2 |
head
列出一小时内占用CPU最多的10个进程
LOOP=3600
for((i=0;i<LOOP;i++))
do
ps -eo comm,pcpu | tail -n +2 >> /tmp/cpu_usage.$$
sleep 1
done
cat /tmp/cpu_usage.$$ | awk '{process[$1]+=[$2]} END{ for(i in process){printf("%-20s %
s",i,process[i);} }' | \
sort -nrk 2 | head
一些监控命令
watch #在某段时间间隔内不断监视某个命令的输出
watch ls #监控ls
watch 'ls -l | grep xx' #监控ls和grep
watch -d ls #高亮显示变化
inotifywait #用来收集有关文件访问的信息
用logrotate管理日志文件
配置目录位于/etcc/logrotate.d
可以为自己的日志文件编写一个特定的配置
cat /etc/logrotate.d/program
/var/log/program.log {
missingok
notifempty
size 30k
compress
weekly
rotate 5
create 0600 root root
}
其中/var/log/program.log 指定了日志文件路径,旧的日志文件归档之后也放入同一个目录中
配置参数
missingok 如果日志文件丢失则忽略,然后返回(不对日志文件行轮替)
notifempty 仅当源日志文件非空时才对其进行轮替
size 30k 限制实施轮替的日志文件大小,可以用1M表示1MB
compress 允许用gzip对较旧的日志进行压缩
weekly 指定进行轮替的时间间隔,可以是weekly,yearly,daily
rotate 5 这是需要保留的旧日志文件的归档数据。在这里是5
所以这些文件名将会是program.log1.gz,program.log.2.gz直到program.log.5.gz
create 0600 root root 指定所要创建的归档文件的模式,用户以及用户组
用syslog记录日志
/var/log是存储日志文件的公共目录,这里的文件是被称为syslog的协议处理的
由守护进程sylogd负责执行
linux中的一些重要日志文件
/var/log/boot.log 系统启动信息
/var/log/httpd apache web服务器日志
/var/log/message 发布内核启动信息
/var/log/auth.log 用户认证日志
/var/log/dmesg 系统启动洗洗
/var/log/mail.log 邮件服务器日志
/var/log/Xorg.0.log X服务器日志
logger LOG_MESSAGE
logger this is a test log line
tail -n 1 /var/log/message #查看刚刚输出的日志,如果是用logger命令,他默认记录到
#这个文件中
logger TAG this is a message #通过TAG将日志记录到不同的文件中
第九章 管理重任
收集进程信息
ps -f 显示更多的列
ps -e 系统的每一个进程
ps -ax 也类似ps -ef
ps -o 指定输出的列,如ps -o comm
ps -eo comm,pcpu | head
-o 适用的参数如下
pcpu cpu占用率
pid 进程ID
ppid 父进程ID
pmem 内存使用率
comm 可执行文件名
cmd 简单明了(simple command)
user 启动进程的用户
nice 优先级(niceness)
time 累计的CPU时间
etime 进程启动后度过的时间
tty 所关联的TTY设备
euid 有效用户ID
stat 进程状态
--sort对特定参数进行排序,+ 表示升序,- 表示降序
ps -eo comm,pcpu --sort -pcpu | head
ps -C [command_name] #如 ps -C bash
ps -C bash -o pid= #跟上pid= 就可以移除头部,只显示单个pid
#类似pidof
ps -u 有效用户
ps -U 真实用户
#如 ps -u root -U root -o user,pcpu
ps -t TTY1, TTY2 ...
#如 ps -t pst/0, pst/1
ps -eLf #NLWP是进程的线程数量,NLP是ps输出中每个条目的线程ID
ps -eLF --sort -nlwp | head
ps -e w # w表示宽松输出
ps -eo pid,cmd e | tail -n 3 # e表示显示进程依赖的环境变量
杀死进程以及发送或响应信号
kill -l #列出所有可用信号
kill PROCESS_ID_LIST #终止一个进程
kill -s SIGNAL PID #参数SIGNAL要么是信号名称,要么是信号数
具体如下:
SIGHUP 1 对控制进程或终端进行挂起检测
SIGINT 2 当按下ctrl+c时发送该信号
SIGKILL 9 用于强行杀死进程
SIGTERM 15 默认用于终止进程
SIGTSTP 20 当按下ctrl+z时发送该信号
#强行杀死进程
kill -s SIGKILL PROCESS_ID
kill -9 PROCESS_ID
killall process_name
killall -s SIGNAL process_name
killall -9 process_name #强行杀死
killall -u USERNAME process_name #通过名称以及所属用户名指定进程
pkill process_name #pkill和kill类似,但是pkill接受的是进程名
#trap命令在脚本中用来为信号分配处理程序
trap 'echo `date`:can not terminate by ctrl+C' 2
#将对一个进程执行kill或者对某个进程执行ctrl+c 时候,会出现上面的提示
#说明已经捕捉了此信号
which,whereis,file,whatis与平均负载
#which命令用来找出某个命令的位置。我们在终端输入命令的时候无需知道对应的可执行文件位于
#何处。终端会在一组位置中查找这个命令,这一组位置由环境变量PATH指定
#如 which is
#where和which命令类似,但是它不仅返回命令的路径,还能够打印出其对应的命令手册的位置以及命令源代码的路径
whereis ls
#file 命令用来确定文件的类型
file /bin/ls
#whatis命令会输出作为参数的命令的简短描述信息,这些信息是从命令手册中解析得来的
whatis ls
#平均负载,显示了1分钟,5分钟,15分钟的平均负载情况,以及系统的开机时间
uptime
向用户终端发送消息
wall
mesg
收集系统信息
hostname #打印当前系统的主机名
uname -n #打印当前系统的主机名
uname -a #打印linux内核版本,硬件架构等详细信息
uname -r #打印内核发行版本
uname -m #打印主机类型
cat /proc/cpuinfo #打印出CPU的相关信息
cat /proc/cpuinfo | head -n 5 | tail -1 #获得处理器名称
cat /proc/meminfo #打印内存的详细信息
cat /proc/partitions #打印分区的详细信息
fdisk -l #同上
lshw #同上
用/proc收集信息
系统中每一个运行的进程在/proc中都有一个对应的目录
environ 包含与进程相关联的环境变量
cwd 是一个到进程工作目录的符号链接
fd 包含了由进程所使用的文件描述符
用cron进行调度
cron表每一个条目都由6部分组成,按照下列顺序排列
分钟 0--59
小时 0--23
天 1--31
月份 1--12
工作日 0--6
命令 在指定时间执行的脚本或命令
* 表示指定命令在每一个时间段都执行
02 * * * * /home/slynux/test.sh #在每天的每个小时的第2分钟执行
00 5,6,7 * * /home/slynux/test.sh #要在每天的第5,6,7小时执行脚本
00 */12 * * 0 /home/slynux/script.sh #在周日的每个小时执行脚本
00 02 * * * /sbin/shutdown -h #在每天凌晨2点关闭计算机
crontab -e #手动编辑cron脚本
crontab -l #列出cron表中的内容
crontab -l -u slynux #指定用户名来查看其cron表
crontab -r 移除当前cron表中的内容
用户管理脚本
useradd [用户名] #增加用户
deluser [用户名] #删除用户
chsh USER -s SHELL #修改用户默认的shell
usermode -L USER #锁定用户
usermode -U USER #解锁用户
chage -E DATE #处理用户账户的过期信息
其他选项
-m MIN_DAYS #将更改密码的最小天数修改成MIN_DAYS
-M MAX_DAYS #设置密码有效的最大天数
-W WARN_DAYS #设置在前几天提醒需要更改密码
passwd USER #更改用户密码
addgroup GROUP #增加一个新用户组
delgroup GROUP #删除一个用户组
figer USER #显示用户信息
参考:
linux shell关联数组
相关推荐
Linux Shell脚本攻略是一本针对Linux操作系统下Shell脚本编写的指导书籍。Shell脚本是利用Shell编程语言来控制和自动化命令序列的脚本,常用于系统管理、服务器管理、自动化任务处理等领域。本书的第三版包含了全面...
**Linux Shell脚本攻略概述** Linux Shell脚本是Linux操作系统中一种强大的自动化工具,它允许用户通过编写脚本来执行一系列命令,实现系统管理和任务自动化。本书《Linux Shell脚本攻略》(第2版)深入浅出地介绍...
《Linux shell 脚本攻略-第二版》是一本深受赞誉的书籍,旨在帮助读者深入理解并掌握Shell脚本编程。这本书的源代码合集提供了丰富的实例,供读者实践和学习。 Shell脚本的基础在于Bash(Bourne-Again SHell),它...
Linux Shell脚本攻略(第2版) (图灵程序设计丛书) linux shell脚本攻略 电子书
Linux Shell脚本攻略是一本专为想要深入理解并掌握Linux Shell编程技术的读者精心编写的指南。Shell脚本是Linux操作系统中的强大工具,它允许用户通过编写简单的命令行指令组合来自动化日常任务,提高工作效率。这...
通过学习这个《Linux Shell脚本攻略》,你将能够编写出高效、易维护的Shell脚本来解决各种自动化任务,提高你的系统管理和开发效率。无论是日常运维还是嵌入式系统编程,熟练掌握Shell脚本都是不可或缺的技能。
一款相当好用的shell攻略,很适合初学shell脚本的人群使用
Linux Shell脚本攻略是针对那些想要深入理解和应用Linux操作系统中的Shell脚本编程的用户而设计的资源。Shell脚本是Linux系统中一种强大的自动化工具,它允许用户通过编写一系列命令来执行复杂的任务,从而提高工作...
LINUX SHELL脚本攻略 写的很好 特地花钱从网上买的
"Linux Shell 脚本攻略 中文 第三版和源码"提供了全面的学习资源,帮助你深入理解并熟练掌握Shell脚本编程。 首先,让我们了解什么是Linux Shell。Linux Shell是操作系统内核与用户交互的界面,它是命令行解释器,...
本资源提供的“Linux Shell脚本攻略源代码”是一份详细的学习材料,对于想要掌握或提升Shell脚本技能的人来说极具价值。 首先,让我们了解一下Shell的基本概念。在Linux中,Shell是用户与操作系统内核交互的界面,...
这份资源包含"Linux Shell脚本攻略中文版"的PDF文档以及一本名为"Linux Shell Scripting Cookbook"的英文电子书,还有"linux+shell+script.rar"的压缩包,很可能包含了更多实用的Shell脚本示例和资料。 "Linux ...
**Linux Shell脚本攻略概述** Linux Shell脚本是Linux操作系统中一种强大的自动化工具,它允许用户通过编写一系列命令来执行批量任务,简化日常操作。在Linux世界里,Shell脚本对于开发人员、测试人员和运维人员来...
《LINUX SHELL脚本攻略 中文版》是一本针对Linux系统中SHELL脚本编程的实战指南,旨在帮助读者掌握高效、实用的SHELL脚本编写技巧。书中的内容覆盖了从基础知识到高级应用,通过解决110多个实际问题,展示了作者的...
Linux Shell脚本攻略,作为一款深受用户欢迎的学习资源,尤其对于初学者而言,它提供了一个系统且详尽的教程,帮助读者深入理解并掌握Linux Shell编程。Shell脚本是Linux操作系统中的一种强大工具,用于自动化执行一...
Linux Shell 脚本编程基础知识点总结 Linux 脚本编写基础 1.1 语法基本介绍 * `#!` 符号用来告诉系统它后面的参数是用来执行该文件的程序 * 在 Linux 中,使用 `/bin/sh` 来执行程序 * 编辑好脚本后,需要使其可...