cd
pwd
mkdir -p a/b/c
rmdir -p a/b/c
basename /tmp/aaa
dirname /tmp/aaa
head -3
tail -3
umask -S
su - oracle
shutdown -h now, shutdown -r +5, shutdown -r 10:35, shutdown -c
poweroff
ls ls -Srh ( 查看大小,size) ll -t ( 按照时间排序 )
ifconfig
ping
cat
more
history
passwd
id
who
lastlog
uniq ls | uniq
wc ls | wc
uname –a
chown chown -R abc:abc test_folder/ chown -R ,abc test_folder/( 只改变组 )
chgrp chgrp -R abc test_folder/
chmod chmod -R 777 test_folder/ chmod -R u=rwx,g=rw,o=r test_folder/
chmod -R a+x test_folder/ 特殊权限 chmod u+s,r+s,o+s test_folder/
cp cp 命令含有粘贴的含义 cp -a test_folder/ abc/
cp -fr test_folder/ abc/
rm rm -rf rm -ri
file 针对文件 file aa
whereis 针对命令 whereis cd
which 针对命令 which cd
type 针对命令(bash别名) type cd
dumpe2fs dumpe2fs -h /dev/sda1
df df - h
du du --max-depth=1 -h
ln 实体链接, 所有路径都可以 ln aa bb
ln -s 符号链接 源文件必须使用绝对路径,(同一个文件夹下边可以不指定路径)
ln -s /tmp/test_folder/aa ../bb
touch aa mtime为修改时间, atime为读取时间, ctime为修改属性时间 ll --time=atime, ll --time=ctime, ll
touch -c -t '1201011010' aa ( 修改aa读取和修改时间为 12年1月1日10点10分 )
touch -m -t '1201011010' aa ( 修改aa 的修改时间为 12年1月1日10点10分)
touch -a -c '1201011010' aa ( 修改aa 的读取时间为 12年1月1日10点10分)
find find path -option [-print] [-exec command] {} ; find . -maxdepth 1 -name aa
find . -maxdepth 1 -perm 777
find . -maxdepth 1 -user root
find . -maxdepth 1 -group root
find . -maxdepth 1 -mtime(atime, ctime) -4(+4, 4)( +4 4天以前, -4 4天以内, 4 刚好之前的第4天
find . -nogroup
find . -nouser
find . -newer f1
find . -type b/d/c/p/l/f #块设备,目录,字符设备, 管道, 符号链接, 普通文件 find . -type d
find . -maxdepth 1 -size +4096(4096, -4096) #+大于4096, -4096小于4096, 4096等于4096
find . -name "*.txt"
find . -name "[A-Z]*"
find . -name "[a-z][a-z][0-9][0-9].txt" -print
find . -type f -exec ls -l {} ; 注意最后必须要有个分号;
find . -mtime + 5 -exec rm -rf {} ; 等于 find . -mtime + 5 | xargs rm -rf
fdisk -l
fdisk fdisk 根据提示进行分区, fdisk /dev/sda 其中, 提示如下: 前4个partition默认为主分区, 所以可以是P+P+P+E, 这种类型
d 删除一个分区
m 返回主菜单
n 新建一个分区 可以使用 +50(K,M,G) 来限制分区的大小
p 打印已经分区情况
t 确定分区的类型
q 退出不保存
w 退出并保存
格式化 mkfs -t ext3 /dev/sda3
挂载 mount /dev/sda3 /newdisk
卸载 umount /dev/sda3 或者 umount /newdisk
设置启动自动挂载, /etc/fstab 编辑 /etc/fstab, /dev/sda3 /newdisk ext3 defaults 1 2
扩展分区中的 逻辑分区, 无法在 /dev 中显示 ? (只要关闭 linux, 就会出现) 然后, 逻辑分区的挂载等情况和主分区一样
生成一整块存储空间, 可以被当做分区挂载 dd if=/dev/zero of=./xxx bs=1M count=1024
格式化刚刚的块 mkfs -t ext3 xxx
挂载刚才生成的块 mount -o xxx /dd_disk
卸载刚刚的 umount /dd_disk
sort + 4 -r sort 是对文本文档进行排序的, 不适用于类似 ls 等查询结构的情况.
cut 截取, 类似urtalEdit 一样, 一列一列的 df | cut -d " " -f1
df | cut -c 10-20
tr cat file | tr -d 'x' >new_file
cat file | tr -s 'a' 'b' >new_file
tr -s 'a' 'b' <stat.txt >stat.tmp
groups 查看所属的组, 第一个为有效组
useradd useradd -g oinstall -G dba -d /home/oracle
usermod usermod -g oinstall -G dba -d /home/abc
userdel userdel oracle
finger 查看系统里用户情况 finger oracle
groupadd groupadd xxx
groupmod groupmod -n ooo xxx( 更名,-n是-name的意思)
sed 文本处理工具,本身是一个管道命令, 主要是以行为单位处理, 可以根据行 常用option:-n slient
进行 替换, 删除, 新增, 选取 等工作 常用option: -f 直接将sed动作写在一个文档内 -f filename
sed[-nefri] command 输入文本 常用option: -i直接修改读取档案内容,而不是输出到屏幕
a 新增, c取代, d删除, i插入, p打印, s搭配正则表达式
sed '2d' abc 删除abc文件的第2行
sed '2,$d' abc 删除abc文件的第2行到最后一行
sed '/test/'d abc 删除文件所有包含test的行
sed '1,2a asdf' abc 在abc文件的1-2行增加 asdf
sed '1,2s/old/new/g' abc 替换abc文件中的1,2行new->old
sed 's/被替换内容/要替换内容/g' file
sed 的处理单位是一整行
awk 使用方法 awk '{pattern + action}' {filenames}
调用方式 3 种 1. 命令行 awk [-F field-separator] 'command' imput-files
2. awk 脚本 这种可以把所有的awk命令放到一个文件中, 并把文件头改为 #!/bin/awk
3. 将所有的 awk 命令插入到一个单独文件, 然后调用. Awk -f awk-script-file input-files
last -n 5 | awk '{print $1}'
流程 读入有'
'换行符分割的一条记录,然后将记录按指定的域分隔符划分域,填充域,$0则表示所有域,$1表示第一个域,$n表示第n个域。默认域分隔符是"空白键" 或 "[tab]键".
cat /etc/passwd |awk -F ':' '{print $1" "$7}'
cat /etc/passwd |awk -F ':' ' BEGIN{print "name,shell"} {print $1","$7} END {print "blue, /bin/nosh"}'
流程 先执行BEGING,然后读取文件,读入有/n换行符分割的一条记录,然后将记录按指定的域分隔符划分域,填充域,$0则表示所有域,$1表示第一个域,$n表示第n个域,
随后开始执行模式所对应的动作action。接着开始读入第二条记录······直到所有的记录都读完,最后执行END操作。
awk -F ':' '/root/' /etc/passwd 搜索包含 root 的行, 支持正则表达式
awk 编程, 用; 分隔执行语句 awk '{count++; print &0;} END{print "user count is", count}' /etc/passwd
编程借鉴了c语言的, if语句, for循环 等等
awk 的处理单位是, 一行在内部按照分隔符要求, 分出的区域
fg/bg 进程的前端和后端, 不同于排程 fg/bg %1 vi abc &
jobs 直接显示目前的job情况 kill -1 -9 -15 %1(job no.)
kill 1重新读取, 9强制停止, 15正常方式结束 kill -9 10633( 10633是pid)
ps ps -ef, ps -l, ps -afjx(树)
top
free
vmstat
netstat netstat -tlnp
rpm rpm -qa 1023.rpm 查看包
rpm -ivh *.rpm 安装包
rpm -Uvh *.rpm 更新包
gzip 压缩 gzip -v abc.txt, zcat abc.gz, gzip -dv abc.gz
bzip2 压缩 bzip2 -v abc.txt, bzcat abc.bz2, bzip2 -dv abc.bz2, bzip2 -kv abc.txt
tar 打包 tar -czv -f abc.tar.gz aa/ abc.txt
查看 tar -tzv -f abc.tar.gz
解压 tar -xzv -f abc.tar.gz -C /tmp/test --exclude abc.txt
打包 tar -cjv -f abc.tar.bz2 aa/ abc.txt
查看 tar -tjv -f abc.tar.bz2
解压 tar -xjv -f abc.tar.bz2 -C /tmp/test --exclude abc.txt
正则表达式 [] 中的某一个 grep '[ae]st' aa.txt ast','est'
[^g]不包括g的 grep '[^g]oo' 有连续oo, 前边不包括g
[:lower:][:upper:][:digit:][:alumn:](字母,数字)[:alpha:](字母)
^ 没在中括号内表示行头
$ 表示行尾
. 代表任意一个字符
* 重复前一个字符, 0个~N个 *前边字符实际上已经于*结合
转义字符, 可以将特殊字符转义成普通字符
{} 限定连续范围 grep -n 'o{2,5} regular.txt 这样搜索的话, gooooooooo也会被搜索出来, 因为搜索时只要满足条件就不继续搜索了.
{} 增加开头结尾限制 grep -n 'go{2,5}g' regular.txt g开头,g结尾
例行工作排程 可以脱离终端机的bash, 后台运行 at now + 3 minutes, 进入at界面, 输入命令, 例如 echo “hello,world", 然后ctrl+d 退出
at 一个时间点执行的排程 at 10:30 2013-12-20 at now + 3 days
atq 查看一个时间点执行的排程的计划
atrm 删除, 注意rm本来就是linux中的删除命令, atrm 所以是排程删除 atrm 11 11 是排程号
at -c 查看排程的具体内容 at -c 11
crontab 循环执行的排程, 其实就是一个档案记录的修改, 增加一行就是增加一个排程 crobtab -e -l -r
这个档案就是 /etc/crontab 和 /var/spool/cron(crontab 修改的内容 )
crontab -u[username] [-l -e r ] 其中 -u 只有root才可以, 帮助其他用户建立排程
分钟 小时 日期 月 周 指令 其中 -e 表示编辑
其中 * 代表任何 其中 -l 表示查看
其中 , 代表时间段, 0 3,6 表示只有3 和 6 这两个小时执行 其中 -r 表示删除
其中 - 代表时间间隔 0 3-6 表示3到6点, 3,4,5,6
其中 /n 表示每个, 第一个字段用 /5 表示每个5分钟
系统每分钟都会读取 /etc/crontab 与 /var/spool/cron 内容
其中 /etc/crontab 分为每小时, 每天,每周,每月
系统服务 /etc/services(服务对应端口)
/init.d/atd restart, status, stop 等( 各种服务的启动, 关闭等等 ) oracle 启动时自动启动可能用到
write: 只能发给单独的用户, write root [tty], 例如 write root pts/1 进入说话界面, ctrl+d退出, 再比如 write root pts/2
mesg n 关闭通话 mesg y 打开通话
wall “hello” 广播
bash
bash 支持通配符 * ? [] [-] [^], 当指令过长时, 可以执行换行( 同时也是转义字符)
当定义变量时,需要先执行某个命令时, 用 $(), 例如 dbtest=$(uname)oracle , 注意: 这是小括号, 要先执行小括号里的命令
如果要扩充变量, 因为默认情况下变量值都是字符串的, 所以可以使用字符串进行扩展, 例如 PATH="$PATH":/home 或者 PATH=${PATH}:/home, 注意: 这是大括号, 大括号的作用是将变量值带出, 而不是只显示变量名(前边一定是双引号)
unset ddd 取消变量
bash 可以进入子 bash
set 显示所有的环境变量, 包括 PATH 等等( 个人感觉是对bash环境的设定)
stty -a 是用来查看bash 编辑设置的, 注意与 set 的区别. 比如你编辑 sqlplus 的退格, 可以使用 stty erase backspace( 键盘上的退格键 )
重定向:
标准输入 stdin, 代码 0, 使用 < 或 << ( 其中 << 表示要读取结束字符) 将原本需要键盘输入的数据改为由档案(file)内容代替
标准输出 stdout, 代码 1, 使用 > 或 >> ( 其中 >> 表示不覆盖, 继续接着输出 )
标准错误输出 stderr, 代码为2, 使用 2> 或 2>>
cat >filename <abc 表示本来要将输入的内容重定向到filename, 现在有档案abc代替输入
cat >filename <<"eof" 表示当输入eof 这个字符串时才表示输入完成
ls > filename, ls >> filename, 将本来由屏幕输出的内容, 重定向输出到文件中
ls >filename 2<err, ls >>filename 2>>err 其中err也是一个filename
ls >filename 2>&1, ls >>filename 2>&1 将错误和正确的都写入一个文件, 注意文件内并没有区别那些事由正确的写入, 那些是由错误的写入 ( 2>&1 类似一个固定符号, 表示错误的和正确的一起的意思)
多个指令, 例如, cd / ; ls , 因为指令执行后, 会有结果状态返回, 所以可以添加一些逻辑进去
ls /tmp/abc || mkdir /tmp/abc ( 如果第一个指令执行成功, 那么就不会执行第2个指令, 所以语义是, 如果目录存在, 就不创建了, 直接显示 )
ls /tmp/abc && mkdir /tmp/abc/aa ( 如果第一个执行成功, 那么才可以执行第2个指令, 所以语义是, 如果目录存在, 就在该目录里创建一个子目录 )
| 管线命令, 前一个命令的输出内容被后一个命令所读取, 管线命令只接受 stdout 而忽略 stderr ( 前一个指令的标准输出)
xargs 可以读取 stdin 内容, 剖析, xargs 命令左边部分就是将要作为 stdin, 注意, 左边部分是其他命令的标准输出 stdout, 右边部分表示要利用这个stdin 而执行的命令, 例如: || xargs cut -d "" f1
即 前一个命令执行的结果作为一个参数, xargs 右边命令依赖这个参数来执行, 右边的命令将这个参数作为标准输入.
shellscript
执行方法
1. 修改档案的可执行权限, 然后 ./档案名 ( 也可以使用绝对路径+档案名)
2. 使用 bash 或 sh 来执行, 例如 bash ex.sh
这两种执行方法都会创建一个子bash, 来执行,这样, 在shellscript脚本中创建的变量, 并不会在运行的bash(父bash)中被定义, 即shellscirpt 会创建一个子 bash 来执行这个脚本, 执行完后会返回到父bash中, 但是变量结果等等就全部没有了.
3. 但是, 如果你使用 source或. 来执行脚本, 例如 source ex.sh, 那么, 这个脚本就会父bash本身执行, 所以在脚本中定义的所有变量, 都有效.
数值计算, 方法 declare -i total=$fisrtNum*$secondNum 或者还可以使用 total=$(($firstNum*$secondNum)) #两个小括号
判断, test -e -f -d -L -r -w -x -u -g -s
文件之间判断 test file1 -nt file2, test file1 -ot file2, test file1 -ef file2
数值之间判断 test n1 -eq n2, test n1 -ne n2, test n1 -gt n2, test n1 -lt n2, test n1 -ge n2, test n1 -le n2
字符串之间判断 test -z string 判断是否为空, 如果是空返回true, test -n string 判断是否为非空, 如果为非空返回 true, test str1=str2, test str1!=str2
多重判断 -a and, -o or, ! 取反, 例如 test -f filename -a -x filename, test ! -x file ( 如果file不具备可执行权限, 返回true)
[] 等于 test, 也可以进行判断, 例如 [ -z "HOME" ] && echo "null" || echo "yes", 注意, 使用中括号作为判断是, 中括号里边两端要有空格
在中括号内每个组件都需要有空格键来分隔, 在中括号内的变量最好使用 "$value" 的形式, 在中括号内的常量, 最好使用'',或""号括起来, 另外中括号比较常用在 if then fi 中.
关于档案名的文件类型判断
-e 判断档案是否存在 (常用)
-f 该档案是否为file (常用)
-d 该档案是否为文件夹 (常用)
关于档案权限判断
-r 是否存在可读权限 (常用)
-w 是否存在可写权限 (常用)
-x 是否存在可执行权限 (常用)
两个档案之间的比较
-nt file1 是否比 file2 新
-ot file1 是否比 file2 旧
-ef file1 是否与 file2 为同一个档案, 在 hardlink 时用
两个整数的之间的判断
-eq 两数值相等
-ne 两数值不等
-gt n1 > n2
-lt n1 < n2
-ge n1 >= n2
-le n1 <= n2
判断字符串数据
-z string 判断是否为空串, 如果为空串返回 true
-n string 判断是否为非空串
string1 = string2 判断是否为相等
string1 != string 判断是否为不等
多重条件判断
-a 逻辑与, 例如 test -r filename -a -x filename
-o 逻辑或
! 逻辑非, 例如 test ! -x file 当不具有执行权限时, 返回 true
shellscript 脚本参数, /path/to/scriptname op1 op2 op3 op4, 其中 $0是脚本名, 第一个参数是 $1, 以此类推. $#: 参数个数 $@: "$1""$2""$3""$4"
shift 2 表示拿掉最前面的 2 个参数, 当然这里不包括 $0,
条件判断 if, 可以利用 && 与, || 或
script 好的例子在 /etc/init.d 这个目录下, 全部是系统要运行的脚本, 可以查看
debug
sh [-nvx] script.sh, -n 不执行script, 只检查语法, -v 在执行script前, 先将script内容打印到屏幕上, -x 也是将内容显示在屏幕上, 其中还有每条指令执行后的结果, +后边的是指令
其中的 –x 很好用( 可实现单步跟踪 )
函数, 由于脚本的运行方式是自上而下, 所以函数要放在上边, 类似 C 语言,
注意在函数体内也有内建变量, 跟shellscirpt本身的重名, 就是 $0 函数本身, $1 第一个参数, $2第2个参数, 等等,
所以在函数内部的$1表示的函数的第一个参数, 就类似其他语言函数内部的变量如果跟外边变量重名, 那么会屏蔽掉外部变量.
代码式样, 参看相关如下:
#!/bin/bash
# File: shellscript.sh
# -------------------------------
# Description: just test
# History: Copied, 2013-12-23
# Author: Leon
#
# 函数
function printint() {
echo –n “your choice is “
}
# 打印hello world
echo –e “hello world!a '”
# 读入数据, –p 表示提示
read –p “please input your name:” yourname
fileuser=${yourname}
filename=${fileuser:-“filename”}
date1=$(date –date=’2 days ago’ +%Y%m%d) # 要先执行小括号里的命令
date2=$(date –date=’1 days ago’ +%Y%m%d) # 要先执行小括号里的命令
date3=$(date +%Y%m%d)
file1=${filename}${date1}
file2=${filename}${date2}
file3=${filename}${date3}
touch ${file1}
touch “$file2”
touch “$file3”
# 数值计算
read –p “please input the first number:” firstNum
read –p “please input the secod number:'” secondNum
total=$(($firstNum*$secondNum))
# test
read –p “please input (y/n")” yn
[ “$yn” == “y” –o “$yn” == “Y” ] && echo “ok, continue” # 注意[]里的空格
# argument
echo “$0”
echo “$#”
echo “$@”
echo “$1”
# 删除参数
shift 2 # 除了0以外, 删除1-2 连个参数
shift 1 # 在刚才基础上, 再删除一个参数
# if
if [ ”&yn == “n” ] || [ “&yn” == “N” ] ; then # 因为规定一行只能写一个命令, 所有要加分号在 then 之前
echo “NO”
fi
if ; then
something
elif ; then
something
else
others
fi
# case
case “$1” in
“hello”)
echo “hello”
;;
“hi”)
echo “hi”
;;
*)
echo “ok”
;;
esac
# loop
while [ “$yn” != “yes” –a “$yn” != “YES”]
do
read –p “please input yes/no” yn
done
until [ “$yn” == “eee” –o “$yn” == “EEE” ]
do
read –p “please input something” yn
done
declare –i i=0
while [ “$i” –lt 100 ]
do
i=$((i+1))
done
# for ( 我们不需要定义循环变量, 例如下边的 animal
for animal in dog cat elephant
do
echo “There are ${animail}s”
done
# seq main the step by steup from 1 to 100
for inum in $(seq 1 100)
do
echo ”$inum“
done
for ((i=1; i<=$num; i=i+1))
do
s=$(($s+$i))
done
exit 0
备份与还原