一些命令
- touch myfile 创建文件,创建的文件一般没有执行权限,需要额外加上。
- chmod u/g/o/a +/-/= r/w/x/s/t/l filename 修改文件权限。
或 r 4 w 2 x chmod 777 myfile
目录的读取就是可以列出其中的内容,写权限可以在该目录创建文件,执行权限搜索访问目录。目录的权限会覆盖目录中文件的权限。
chmod u+x o-w myfile 文件属主赋予执行权限,其他人赋予写权限
chmod 777 myfile 赋予所有人三种权限
chmod 666 * 一次设置目录下文件
chmod -R 664 dir/* 将目录下所有文件连子目录下所有文件修改权限。
- suid/guid :suid某个用户对属于自己的shell脚本设置了这种权限,其他用户执行这个脚本时也会具有属主相同的权限,如果root设置的脚本,其他用户执行时也会root的权限。guid执行该脚本的用户会具有该文件所用户组的权限 。这种权限有时还是很有用的。。
chmod 4741 file设置suid,权限变为rws-rw-r–,设置这两个权限时需要对应权限位有执行的权限。
chmod 6711 file suid+guid,所有其他用户具有执行权限
chmod u+s filename 使用符号的方式设置
- chown /chgrp创建一个文件,你就是文件的属主,可以改变所有权,将所有权给了别的用户就会擦除suid ,也不能在修改这个文件的权限了。
chown [-R -h] other file -h表示改变符号链接文件的属主时不影响该链接指向的目标文件。
chgrp other file
- 看看自己属于那些用户组,id
- umask,看看创建文件的默认格式
- 符号链接,存在软连接与硬链接,软连接就是一个指向文件的指针。比如一个文件每个用户可以自己的目录下建立一个链接,这样修改源文件就可以更改全部而且每个链接的文件名可以随便取。一个很深的目录,就可以在这个目录下建立一个链接,访问方便。
ln [-s] source_pah target_path 当target_path文件不存在时会自动创建
- find pathname -options [-print -exec -ok] 后三个:匹配文件输出到标准输出,对匹配的文件执行参数给的shell命令格式为‘command’ {} \就是说将find找到的文件名作为参数填入 {} 中; ,-ok 同上,但是更安全给提示是否执行每个命令。
find ~ -name “.txt" -print 用“”扩起文件名模式,在用户的根目录下找名字符合.txt的文件,
find . -name “[A-Z]" -print 当前目录及其子目录中查找文件名以一个大写字母开头的文件
"host” host开头的文件,”[a-z][a-z][0–9][0–9].txt" 根正则一样吧
find . -print == find ~ -name “" -print 所有文件
find /apps -name “/apps/bin” -prune -o -print 在/apps目录下查找,忽略 /apps/bin 目录
find /etc -type d --print 按照文件类型找 find . !-type d 除了目录其他所有类型
匹配到文件后可以使用-exec 中的命令对其进行操作。find . -type f -exec ls -l {} ; 查找普通文件并列出
find . -name ".LOG” -ok rm {} ; 安全模式删除。find . -exec grep “hello” {} ;
find / -type f -print | xargs file 。 find的结果太多在使用命令就会溢出。xargs可以分批处理,这里测试每个普通文件是属于哪类
find / -type f -print | xargs grep “device” 在普通文件里搜 device 这个词。
find ./ -type f -mtime +30 -exec rm -fr {} \; > /dev/null 2>&1
./表示从当前目录找
-type f,表示只找file,文件类型的,目录和其他字节啥的不要
-mtime +30 表示30天前的文件。
-exec 把find到的文件名作为参数传递给后面的命令行,代替{}的部分
-exec后便跟的命令行,必须用“ \;”结束
/dev/null 2>&1 这样的写法.这条命令的意思是将标准输出和错误输出全部重定向到/dev/null中,也就是将产生的所有信息丢弃.
- grep 文本搜索,支持正则表达式
[root@www ~]# grep [-acinv] [–color=auto] ‘搜寻字符串’ filename
选项与参数:
-a :将 binary 文件以 text 文件的方式搜寻数据
-c :计算找到 ‘搜寻字符串’ 的次数
-i :忽略大小写的不同,所以大小写视为相同
-n :顺便输出行号
-v :反向选择,亦即显示出没有 ‘搜寻字符串’ 内容的那一行!
–color=auto :可以将找到的关键词部分加上颜色的显示喔!
- xargs 一个命令的输出作为另一个命令的参数。
cat url-list.txt | xargs wget –c 从文件中读取url,然后下载
find / -name *.jpg -type f -print | xargs tar -cvzf images.tar.gz 将.jpg 的图片打包
、、、
将创建者为chenbaihu的所有进程杀掉。
可以使用ps -elf可以查看进程信息,
可以使用grep chenbaihu配合ps -elf查找chenbaihu创建的进程信息
可以使用awk将进程id截取出来,
可以使用xargs将截取出来的进程id,作为kill -9 的参数。
ps -elf | grep chenbaihu | awk ‘{print $4}’ | xargs kill -9
- ps -elf 查看进程信息,top查看动态进程信息 ps -aux 显示所有进程(BSD风格),,,-e 所有进程,-f 树状图显示 -l 长列表显示
- kill -signal id 杀死后台的进程,比如:kill id
- awk 文本分析工具,将文本整行读入,以空格为默认分隔符切片,然后分部分处理。基本功能就是再文件或字符串中根据规则浏览抽取信息。高级的用来格式化文本中的信息。
last -n 5 | awk '{print $1}' last 最后登录的几个账号,awk以\n分割每条记录,然后按照分隔符划分,$0表示所有区域 ,$1第一个区域
cat /etc/passwd | awk -F ':' '{print $1"\t"$7}' -F 指定分隔符,输出里将$1 $7用\t 分割
cat /etc/passwd |awk -F ':' 'BEGIN {print "name,shell"} {print $1","$7} END {print "blue,/bin/nosh"}'
再输出上方加一行 name,shell,最后加上一行blue,/bin/nosh 中间输出用,分割
复杂的用法跟c语言一样,有循环,条件,数组,变量
- sed 文本处理工具,对数据行进行替换,删除,增加,选取
- who 查看当前系统的用户,显示用户名,tty ,登录时间
- exec代替当前shell,使用这个命令时任何现有的环境都被清除,重启一个shell 。exec command
后台执行命令
就是不在终端屏上运行。
corn系统调度进程,可以使用它在每天的非高峰负荷时间段运行作业
at命令,在一个特定的时间运行一些特殊作业,或者晚一些运行
&在后台运行一个占用时间不长的进程
Nohup 后台运行一个命令,即使用户退出也不影响
cron 和 crontab
cron系统主要的调度进程,可以在无需人工干预的情况下运行作业。crontab命令允许用户提交,编辑删除相应的作业。
格式:分< >时< >日< >月< >星期< >要运行的命令 其中< >表示空格。星期一到星期五在星期里填 1-5,星期一和五,用逗号 1,5。*表示没有限定或者表示连续的时间段,注释用 # 。
30 21 * * * /apps/bin/cleanup.sh
上面的例子表示每晚的 2 1 : 3 0运行/ a p p s / b i n目录下的c l e a n u p . s h。
0,30 18-23 * * * /apps/bin/dbcheck.sh
上面的例子表示在每天 1 8 : 0 0至2 3 : 0 0之间每隔3 0分钟运行/ a p p s / b i n目录下的d b c h e c k . s h。
* * * * * /bin/ls 每分钟执行一次
20 0-23/2 * * * echo "haha" 每月每天的午夜 0 点 20 分, 2 点 20 分, 4 点 20 分....执行 echo "haha":
0 */2 * * * /sbin/service httpd restart 意思是每两个小时重启一次apache
注意用的都是绝对路径,还需要提供脚本相应的环境变量。命令格式:Crontab [-u user] -e -l -r
-u用户名,自己用就不用了,-e编辑crontab 文件,-l 列出文件内容 ,-r 删除crontab 文件。
在向cron 进程提交一个crontab 文件时,首先要设置环境变量,cron进程根据这个来确定使用那个编辑器编辑crontab。或者在 在HOME目录下.profile 写入EDITOR=vmi; export EDITOR
先建个文件 xxxcron,写入0,1 18-06 * * * /bin/echo ‘date’ > /dev/console # 每隔一分钟向控制台输出一次当前时间
crontab xxxcron 提交,crontab -l 列出文件,crontab -l > $HOMW/xxxcorn 备份,crontab -e 编辑文件,环境变量中设置了vim 就可以使用这个编辑,这时可以进行必要的检查。crontab -r 删除文件。crontab filename 恢复
at命令
向cron 提交作业,在稍后的时间运行,可以时几分钟或几天,几个月还是用crontab。提交了作业,at命令会保留当前的环境变量,包括路径,不想crontab只提供默认的环境,这个的输出都以邮件的形式发给用户,除非重定向到了某个文件中。
at -f script(要提交的命令或脚本) -m(作业完成发邮件) -l -r time date at的时间格式更加灵活
at命令提交作业有 at提示符(提交若干行系统命令) 提交脚本可以使用命令行方式
qbx@QBX:~/Desktop$ at 22:50 # 回车进入命令提示符
warning: commands will be executed using /bin/sh
at> find / -name "passwd" --print # 输入命令
at> <EOT> # ctrl+d 退出
job 1 at Thu Sep 16 22:50:00 2021
At 6.45am May12
At 11.10pm
At now+1 hour
At 9am tommorrow
At 15:00 May 24
At now + 10minutes # 这些格式都可以接受
at 3:00pm tommorrow -f /apps/bin/db_table.sh # 提交脚本
echo find /etc -name "passwd" -print | at now +1 minute # 也可以使用echo命令提交
at -l # 列出所有作业
atrm [job id] or at -r job # id通过at -l 查看,
&命令
使用这个命令将作业放到后台执行,可以不在终端显示,但作业后台运行的结果也会输出到屏幕,一般可以重定向到一个文件。格式:命令 &
2>&1 的意思就是将标准错误重定向到标准输出。
find /etc -name "srm.conf" -print > find.dt 2>&1 & # 将查找结果的输出定向到find.dt文件中,会返回一个进程号
任务完成后,按任意键就会有个提示
[1]+ 退出 1 find /etc -name "srm.conf" -print > find.dt 2>&1
ps -ef|grep id or ps x|grep id 查看进程,id就是提交任务时的返回的进程号。
kill -signal id 杀死后台的进程,比如:kill id
nohup
退出账户时仍进行响应的进程 nohup command &。这个命令提交作业,默认所有输出重定向到一个nohup.out 文件中,或者制定 nohup command > myout.file 2> &1
字符串匹配规则
* 匹配文件名中的任何字符串,包括空字符串。
? 匹配文件名中的任何单个字符。
[…] 匹配[ ]中所包含的任何字符。
[!..] 匹配[ ]中非感叹号!之后的字符。
ls app* 以app开头,后面可以跟任意字符,包括空字符串
ls *.doc
ls conf.??.log 省略两个字符
ls [io]* i或o开头
ls log.[!0-9]* 表示非数字
shell输入与输出
shell脚本中,可以使用标准输入(键盘),或者指定一个i文件作为输入,输出一样可以制定一个文件作为输出,或者输出到终端屏幕。
echo
显示文本行或变量,或者将字符输入到文件,echo string. \c不换行 \t \n 前面加上-e 才有效
qbx@ubuntu:~$ echo "$HOME,`tty`" 不是单引号
/home/qbx,/dev/pts/0
echo -e "hi\t e\n\n\n"
echo "The log files have all been done"> myfile 重定向到一个文件中
echo "$LOGNAME carried them out at `date`">>myfile 追加到一个文件的末尾不覆盖原有的内容
echo "\"/dev/rmt0"\"
read
从键盘或文件的某一行文本中读入信息,将值赋给一个变量。直到遇到一个文件结束符或回车。
read name a b
123 a z
echo $name
123
read a b # 过长的内容就都给最后的变量了。
ni tai shuai l
# 一个简单的shell var_test
#! /bin/sh
# var_test
echo -e "First name:\c"
read name
echo -e "Middle name:\c"
read middle
echo -e "Last name:\c"
read surname
bash var_test # 运行
cat
显示文件内容,创建文件,还可以显示控制字符,这个显示会一下显示所有内容,要想显示一页,可以使用more 或将输出管道传递给另一个具有分页功能的命令中。
cat file | more
cat -v 显示控制字符 file1 file2 file3 显示多文件
cat myfile1 myfile2 myfile3 > bigfile 创建一个bigfile 文件包含三个文件的内容
cat > myfile 创建文件,并输入一些内容,然后ctor+d 退出。
管道
将一个命令的输出传递给另一个命令作为输入,就是上面的 | ,命令1 | 命令2 .
ls | grep qbx* 将列出的文件交给右边,然后再文件列表中搜索qbx开头的文件。
qbxcron
who | awk '{print $1"\t"$2}' 只显示用户名和所在终端
df -k | awk '{print $1}'|grep -v "Filesystem" 查看文件系统,
tee
作用可以用字母 T 表示,将输出的一个副本送给标准输出,另一个副本拷贝到对应文件中。就是再看到一个输出,同时存入一个文件。tee -a file -a表示内容放到文件末尾。
执行某些命令或脚本,希望将输出保存,这个命令就很方便。
qbx@ubuntu:~/Desktop$ who | tee who.out
qbx :0 2021-09-18 04:25 (:0)
qbx@ubuntu:~/Desktop$ cat who.out
qbx :0 2021-09-18 04:25 (:0)
echo "hi" | tee /dev/console 将输出重定向到控制台上
tee: /dev/console: Permission denied
hi
标准输入,输出,错误
shell执行命令时,每个进程都和三个打开的文件相连,标准输入(文件描述符0),标准输出(1) ,标准错误(2)。
标准输入默认时键盘,也可以时其他文件或命令的输出。
标准输出默认时屏幕,可以是文件。
标准错误,命令错误的输出,默认屏幕同样可以是文件。
文件重定向
cat /etc/passwd| awk -F : '{print $1}'|sort 1>sort.out 将passwd的用户ID排序送到sort.out文件,sort 命令后面跟两个空格,否则会将重定向符号当作输入。
ls -l | grep ^d >>files.out 将多命令的输出追加到同一个文件中。>>追加就是接着的意思吧
>nofile 创建一个新文件
sort < name.txt 重定向标准输入 或者 sort name.txt 直接作参数
command << 分界符 将分界符之后直到下一个同样的分界符之前的所有内容作为输入。下一个分界符结束,分界符任意,最常见EOF。
还可以再<<后输入变量
cat >> myfile << EOF 输入到myfile 不加后面的EOF要ctrl+d结束,这里输入EOF就可以了
> emm,$TERM
> hh $LOGNAME
> bye
> EOF
grep "trident" missiles 2>/dev/null 将错误信息重定向到垃圾箱里(/dev/null)不会显示再屏幕上
grep "a" * 2 >> a.err *表示
grep "b" *2 >> a.err 将两个错误放到一个文件,不会覆盖
一个快速发现错误的方法就是,先将输出重定向到一个文件中,然后再把标准错误重定
向到另外一个文件中。cat account_qtr.doc account_end.doc 1>accounts.out 2>accounts.er
合并标准输出和标准错误,grep “standard”* > grep.out 2>&1 以standard为开头的,grep standard* 一样
exec
代替当前shell,使用这个命令时任何现有的环境都被清除,重启一个shell 。exec command。
可以使用exec命令通过文件描述符打开关闭文件。
$cat f_desc 一个脚本来读取两行并显示,这里使用文件描述符4,4-9都可以
#!/bin/sh
# f_desc
exec 4<&0 0<stock.txt # 标准输入(文件描述0)
read line1
read line2
exec 0<*4
echo $line1
echo $line2
$cat stock.txt
emmm
hello,world!
$ bash ./f_desc
emmm
hello,world!
命令总结 | ||||
---|---|---|---|---|
touch | chmod | id | umask | ln |
chown | chgrp | find | grep | xargs |
cat | ps | top | kill | awk |
last | sed | who | exec | crontab |
at | & | nohup | echo | read |
tee | >> << |