============================= 一般 =========================================
chown -R oracle:oinstall u01/ @ chown -R .oinstall u01/
chmod -R 744 u01/ @ chmod u=rwx,g=rx,o=r u01/ @ chmod u+x u01/ ( 注意u=rwx,g=rx,o=r之间不能有空格)
chgrp -R oinstall u01/
cd
pwd
mkdir -p u01/oracle
rmdir -p u01/oracle
cp -a abc @ cp -fr abc
rm -fri
mv -fiu 源文件, 目的地
basename
dirname
head head -3 aa 另一种截取方法 tail + 7 aa | head 4 ( tail 是正向显示 7 行以后的内容 )
tail tail -3 aa head 和 tail 一起使用, 截取中间行, 例如截取7-10行, head -10 aa | tail -4
umask -S
设置特殊权限, SUID, SGID, SBIT(只针对目录有效) chmod u+s, chmod g+s, chmod o+s
su - oracle
file aa
which (show shell command)
whereis (源码, 命令)
type (命令类型)
date +%Y%m%d
cal 10 2009 ( month, year )
shutdown -h now @ shutdown -r +5 @ shutdown -r 10:35, shutdown -c
poweroff
ls ls -alF @ ls -d @ ll -R @ ll -t 时间倒叙
ifconfig
ping
cat cat -n aa
tac tac aa
nl nl aa
more
dumpe2fs -h /dev/sda1
df df -h df -ih
du du -h du -sh
目录->文件名->inode->datablock( 从根目录开始这样做, 其中根目录的inode为2 )
ln makefile ../makefile
ln -s makefile /tmp/asd ( 如果目标和快捷方式在同一个文件夹下, 就不需要指定路径, ln -s 20.txt 10, 如果想指定路径, 那么源文件必须使用绝对路径, 例如 ln -s /tmp/20.txt xx/ 表示为 /tmp/20.txt 这个源文件(绝对路径) 在xx这个目录下建立一个符号连接, 没有指定连接名, 那么就会给源文件同名 )
dd if=/etc/zero of=/newdisk/aloop bs=1M count=512
mkfs -t ext3 /newdisk/aloop
mount -o loop /newdisk/aloop /media/cdrom/
history
sort sort +4 ( 第4列正向排序 ) @ sort +4 -r ( 第4列逆向排序 )
cut df | cut -d " " -f1 @ cut -c 10-20 ( 10 至 20 列 )
awk '/good/' aa.txt ( awk 将文本逐行读入, 以空格为默认分隔符将每行切片, 切片的部分再进行各种分析 )
awk '{pattern + action}' {filenames} 其中 pattern 为数据中查找内容, action表示找到匹配后所执行的一系列指令, 花括号不需要在程序中出现,
但它们用于根据特定的模式对一系列指令进行分组, pattern就是表示正则表达式, 用斜杠括起来, awk执行方式如下:
awk -F 分隔符 'command' input-files
可以在脚本中执行awk,也可以把要执行的命令放在一个脚本中, 执行
last -n 5, last -n 5 | awk '{print $1}' 工作流程, 读入有' '换行符分割的一条记录, 然后记录按指定分隔符划分区域, 默认分隔符是空格, $0所有域, $1第一个区域,类推
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"}' 从begin执行到end结束
awk -F: '/root/' /etc/passwd
groups 查看群组情况, 切换有效群组 newgrp usergroup
useradd useradd oracle -g oinstall -G dba -d /home
passwd passwd oracle
usermod 与 useradd 类似设置
userdel userdel -r 连同家目录一起删除
id id nobody
finger finger oracle 可以查看到上次登录信息
groupadd oinstall
groupdel oinstall
groupmod groupmod -n ooo oinstall
who
lastlog
uniq
wc
write: 只能发给单独的用户, write root [tty], 例如 write root pts/1 进入说话界面, ctrl+d退出, 再比如 write root pts/2
mesg n 关闭通话, mesg y 打开通话
wall “hello” 广播
tr tr -d ':' @ tr -s 'a' 'x' cat a.txt | tr -s 'a' 'x'
& vi aa &
fg / bg fg fg 1 ( 1 为 job no. ) vi aa & 可以把 aa 放到背景下工作, 但是, 注意这个有别于排程, 这个还是在你当前的环境下, bash里, 也就是说, 当你关闭了连接, 在背景下工作的内容也没有了, 通过下边的命令jobs可以看到你目前中在使用的工作内容, 主要的目的就是把工作放到背景下, 让你可以同时做几项工作. 个人感觉 bg 这个命令没什么用, fg 还有些用, 另外下边的kill 命令, 如果kill 的是 job no. 则必须加 % 号, 即 kill -1 %1
jobs
kill -1,9,15 %jobno. 直接数字表示PID ( 1重新读取, 9强制删除, 15一般退出 )
ps ps -ef @ ps -l @ ps -axjf ( 内存情况 )
top ( 实时监控 内存 CPU 使用情况 )
free -m ( 内存情况 )
uname -a ( 核心情况 )
netstat -tlnp ( 网络情况 )
vmstat ( 内存, IO 等所有资源使用情况 )
fuser -uv /proc ( 查看某个文件夹谁正在使用 )
lsof lsof -u oracle +d /u01 ( 档案被开启情况 )
rpm -qa 查看某个包是否安装 rpm -ivh 安装包 rpm -Uhv 更新包
===================================== 难 =========================================
touch
ll --time=atime(查看读取时间) @ ll --time=ctime(权限等属性被修改时间) @ ll(文件被修改时间)
权限等被修改时间无法修改, 除非你真正的修改属性, 那么该时间会变成你修改时的当前时间
-c 不会创建文件, 修改 读取时间和文件修改时间 touch -c -t 1201010101 aa
-t 个人比较喜欢这个格式, 分别是年月日小时分钟秒, 每个都是2位数
-m 只change 修改时间, touch -m -t 1201010101 aa
-a 只change 读取时间, touch -a -t 1201010101 aa
find [path][option][action]
-mtime +4 -4 4
-newer file find . -newer /tmp/tmp1 -not newer /tmp/tmp2
-name find . -name law.src @ find . -name 'la?.src'
-user find . -maxdepth 1 -user oracle
-type find . -maxdepth 1 -type f -or -type -d | wc -l
-size find . -size + $((300*1024))k
-perm 权限 find . -maxdepth 1 -perm 755
-maxdepth find . -maxdepth 1 -name test
-group find . -maxdepth 1 -group oinstall
find /oracle/arc -mtime 5 -exec rm -fr {} 等于 find /oracle/arc -mtime 5 | xargs rm –rf
新增加磁盘内容
1. 对磁盘进行分割, 建立可用的partition
2. 对partiton 进行格式化(format), 建立系统可用的文件系统(filesystem)
3. 可选的, 对刚刚建立的文件系统进行检查
4. 挂在该文件系统, 挂在到目录
fdisk -l 查看整个磁盘内容, 比如几个磁盘, 空间, 分配等
fdisk 常用内容 d delete, n add, p print, q quit, w write, m show menu (1-3 为primary 分区, 4 extention 分区 )
分区完, 需要重启, ( 使用 mount 命令可以确认目前文件系统的类型, ext2 还是 ext3 等等 )
mkfs -t ext3 /dev/sda3 ( 格式化新的分区 )
省略检查
mount /dev/sda3 /newdisk
mount -o remount,rw,auto / ( 重新挂载根目录 )
umount -f /dev/sds3 或 /newdisk ( 装置名或挂载点都可以 )
设置开机自动挂载, 不用每次手动挂载 /etc/fstab, /etc/mtab
修改 /etc/fstab 增加 /dev/sda3 /newdisk ext3 default 1 2 (装置名, 挂载点, 文件系统类型, 文件系统参数, 是否被dump, 是否fsck检查 )
压缩与打包
gzip -v abc.txt @ zcat abc.gz @ gzip -dv abc.gz
bzip2 -v abc.txt @ bzcat abc.bz2 @ bzip2 -dv abc.bz2 @ bzip2 -vk abc.txt
tar -cjv -f aa.tar.bz2 aa @ tar -tjv -f aa.tar.bz2 @ tar -xjv -f aa.tar.bz2
tar -czv -f aa.tar.gz aa @ tar -tzv -f aa.tar.gz @ tar -xzv -f aa.tar.bz2
tar -xjv -f aa.tar.bz2 -C /newdisk/tt
tar -cjv -f aa.tar.bz2 aa bb cc ( 多个文件和目录可以一起打包 )
tar -cjv -f tt.tar.bz2 tt --exclude=aa ( 打包文件夹, 但是不包括文件夹内的aa文件 )
正则表达式, 单独列出, 练习
[] 中的某一个都可以 grep 't[ae]st' aa.txt
grep '[^g]oo' 有oo 且前边不是g
grep '[^a-z]oo' 有oo 且前边不是小写字母
[:lower] [:upper:] [:alnum:] [:digit:] [:alpha:]
^ $ grep -n '^t' a.txt grep -n 'o$' a.txt
. 表示任意字符 grep -n 'g..d' a.txt
* 重复前一个0到无穷多次 grep 'oo*' a.txt 注意这可不是说必须有2个o,因为第2个O与*结合了, 他们可以是0到无穷
多个O, 所以该表达式理解为最少有一个O.
{} 限定连续的范围 grep -n 'go{2,5}' regular.txt ( 注意这里需要转义字符,另外,在搜索的过程中,
例如: 你想搜索的是 2-5个,但是,程序搜索时,发现一个字符串满足后,就显示出来,所以6个以上的o也有可能显示出来,所以需要一个尾符号, grep -n 'go{2,5}g' regular.txt
sed '1,2a asdf' test.txt ( 在1,2行末尾添加 asdf )
sed '1,2d' test.txt ( 删除1,2 行 )
sed '1,2s/old/new/g' test.txt( 在1-2行中, 替换满足条件内容 )
例行工作排程
at (可以脱离终端, 在服务器背景下运行, 比如你远程连接Linux, 但是只要一断开, 那么你的程序也就没有了)
/etc/at.allow 与 /etc/at.deny 限制是否可以使用 at 命令
服务是否启动, ps -ef | grep atd | grep -v grep, 如果没启动, /etc/init.d/atd start 启动, chkconfig atd on 开机自动启动
时间格式 HH:MM 或 HH:MM YYYY-MM-DD 04:00 2013-11-11 或 now + 5 minutes 或 04pm + 3 days
at now + 5 minutes 进入 at , 输入排程之后 ctrl+d 退出
atq 查看排程列表, atrm 删除排程 atrm 1 ( 等于 at -d 1 )
at -c 1 详细查看第1个排程内容, at -d 1 取消第一个排程
crontab ( 重复执行 )
/etc/cron.allow 和 /etc/cron.deny
服务是否启动, ps -ef | grep cron | grep -v grep, 如果未启动 service crond start.
crontab -e 编辑, crontab -r 删除整个任务, crontab -l 查看
设置循环 分钟 小时 日期 月份 周 指令
0-59 0-23 1-31 1-12 0-7
* 代表任意时刻
, 表示时间间隔 3,6 表示3点和6点
- 时间间隔 3-6 表示 3 4 5 6
/n 例如 /5 表示每5分钟
例如: */5 * * * * echo "hello" 每个5分钟, 最开始的* 和 /5 是一起的, 表示时间里每间隔5分钟
系统服务
服务名后面带d的就是daemon, 每个service都有对应的 daemon, daemon 就是实现service的, 例如 atd
另外服务要与 port 端口对应
/etc/services ( daemon 与 port 对应)
/etc/init.d/* ( 启动脚本放置处 )
各种服务, 启动, 状态, 关闭 等 例如 /etc/init.d/syslog status @ /etc/init.d/syslog restart
事实上, 在linux中, 要打开或关闭port,就需要启动或关闭某个服务
bash & 重定向
bash 支持通配符 * ? [] [-] [^], 当指令过长时, 可以执行换行( 同时也是转义字符)
当定义变量时需要先执行某个命令时, 用 $(), 例如 dbtest=$(uname)oracle , 注意: 这是小括号
如果要扩充变量, 因为默认情况下变量值都是字符串的, 所以可以使用字符串进行扩展, 例如 PATH="$PATH":/home 或者 PATH=${PATH}:/home, 注意: 这是大括号, 大括号的作用是将变量值带出, 而不是只显示变量名
unset ddd 取消变量
bash 可以进入子 bash
set 显示所有的环境变量, 包括 PATH 等等
环境变量会被子bash所继承
declare -a -i -r -x declare -a var, var[1]=1, var[2]=2 可以单独取消数组元素或取消整个数组 unset var, unset var[1]
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 将错误和正确的都写入一个文件, 注意文件内并没有区别那些事由正确的写入, 那些是由错误的写入
多个指令, 例如, 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 而执行的命令, 例如: ll xargs cut -d "" f1
即 前一个命令执行的结果作为一个参数, xargs 右边命令依赖这个参数来执行, 右边的命令将这个参数作为标准输入, 注意这个 | grep 不一样, 比如 ls | grep aa, 貌似也是讲前边的结果作为参数, 但是
这个命令的实际意义是, 执行前边的命令, 有一个 stdout, 在这个 stdout的基础之上截取一部分, 而 xargs 前边命令根后边命令没有关系, 后边命令只要前边命令执行的结果作为参数, 就好比 前一个命令查看这个班级
所有的优秀学生, 共100个, 然后截取出所有是男生的, 而 xargs 是以这100个优秀学生为参数, 可以查找出这100个优秀学生的父母名字.
shellscript
要修改档案的可执行权限, 然后 ./文件名来执行, 也可以使用绝对路径执行, 或者将路径添加到 PATH, 无论是直接下达命令(绝对路径或相对路径)或者是使用 bash 或 sh , 例如 bash ex.sh 来执行, 都会创建一个子bash
这样, 在shellscript脚本中创建的变量, 并不会在运行的bash(父bash)中被定义, 即shellscirpt 会创建一个子 bash 来执行这个脚本, 执行完后会返回到父bash中, 但是变量结果等等就全部没有了.
但是, 如果你使用 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 中.
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 也是将内容显示在屏幕上, 其中还有每条指令执行后的结果, +后边的是指令
函数, 由于脚本的运行方式是自上而下, 所以函数要放在上边, 类似 C 语言, 注意在函数体内也有内建变量, 跟shellscirpt本身的重名, 就是 $0 函数本身, $1 第一个参数, $2第2个参数, 等等, 所以在函数内部的
$1表示的函数的第一个参数, 就类似其他语言函数内部的变量如果跟外边变量重名, 那么会屏蔽掉外部变量.
代码式样, 参看相关如下:
1: #!/bin/bash
2: # File: shellscript.sh
3: # -----------------------------
4: # Description: This a test shellscript program
5: # History : Created, 2013-11-23
6: # Author : Leon
7: #
8:
9: # function
10: function printit() {
11: echo -n "Your choice is "
12: }
13: # create date file
14: echo -e "hello world!a "
15: read -p "Please input your name:" yourname
16: fileuser=${yourname}
17: filename=${fileuser:-"filename"}
18: date1=$(date --date='2 days ago' +%Y%m%d) # 20131121
19: date2=$(date --date='1 days ago' +%Y%m%d) # 20131122
20: date3=$(date +%Y%m%d)
21: file1=${filename}${date1}
22: file2=${filename}${date2}
23: file3=${filename}${date3}
24: touch ${file1}
25: touch "$file2"
26: touch "$file3"
27:
28: # compute number
29: read -p "please input the First number:" firstNum
30: read -p "please input the Second number:" secondNum
31: total=$(($firstNum*secondNum))
32: echo "The Multiple result is: $total"
33:
34: # judge, test, []
35: read -p "Please input(Y/N):" yn
36: [ "$yn" == "Y" -o "$yn" == "y" ] && echo "ok, continue."
37: [ "$yn" == "N" -o "$yn" == "n" ] && echo "No, try again."
38:
39: # argument
40: echo "The script name is -> $0"
41: echo "total parameter qty -> $#"
42: echo "Whole parameter -> $@"
43:
44: shift 2
45: echo "The script name is -> $0"
46: echo "total parameter qty -> $#"
47: echo "Whole parameter -> $@"
48:
49: shift 1
50: echo "The script name is -> $0"
51: echo "total parameter qty -> $#"
52: echo "Whole parameter -> $@"
53:
54: # if
55: if [ "$yn" == "y" ] || [ "$yn" == "Y" ] ; then
56: echo "yes again"
57: fi
58:
59: if [ "$yn" == "y" ] || [ "$yn" == "Y" ] ; then
60: echo "yes again"
61: elif [ "$yn" == "n" ] || [ "$yn" == "N" ] ; then
62: echo "No again"
63: else
64: echo "nothing"
65: fi
66:
67: case "$1" in
68: "hello")
69: echo "the first argument is Hello !"
70: ;;
71: "hi")
72: echo "the first argument is Hi !"
73: ;;
74: "good")
75: echo "the first argument is good !"
76: ;;
77: *)
78: echo "the first argument is Others !"
79: ;;
80: esac
81:
82: case $1 in
83: "one")
84: printit; echo $1 | tr 'a-z' 'A-Z'
85: ;;
86: "two")
87: printit; echo $1 | tr 'a-z' 'A-Z'
88: ;;
89: *)
90: echo "Usage $0 {one|two|three}"
91: ;;
92: esac
93:
94: # loop
95:
96: # it will execute by true
97: while [ "$yn" != "yes" -a "$yn" != "YES" ]
98: do
99: read -p "Please input yes/YES to stop loop 1 :" yn
100: done
101:
102: # it will execute by false
103: until [ "$yn" == "eee" -o "$yn" == "EEE" ]
104: do
105: read -p "Please input yes/YES to stop loop 2 :" yn
106: done
107:
108: declare -i i=0
109: while [ "$i" -lt 100 ]
110: do
111: i=$((i+1))
112: done
113:
114: read -p "is this result 100 about i" test
115:
116: echo $i
117:
118: # we don't need define animal
119: for animal in dog cat elephant
120: do
121: echo "There are ${animal}s..."
122: done
123:
124: read -p "is these all animal" test
125:
126: # seq main the step by step from 1 to 100
127: for inum in $(seq 1 100)
128: do
129: echo "$inum"
130: done
131:
132: read -p "is these number is 100" test
133: # like c language, for loop
134: nu=100
135: s=0
136: for ((i=1; i<=$nu; i=i+1))
137: do
138: s=$(($s+$i))
139: done
140: echo "The result of '1+2+3...$nu' is ==> $s"
141:
142: exit 0