Linux 总结2


                                           
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}'                                   
    流程    读入有'\n'换行符分割的一条记录,然后将记录按指定的域分隔符划分域,填充域,$0则表示所有域,$1表示第一个域,$n表示第n个域。默认域分隔符是"空白键" 或 "[tab]键".                                   
        cat /etc/passwd |awk  -F ':'  '{print $1"\t"$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\n'”

# 读入数据, –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


备份与还原 

 

 

posted @ 2013-12-23 09:47  神之一招  阅读(1000)  评论(0编辑  收藏  举报