摘自《Linux shell 编程从入门到精通》未完待续!!!

【注释】

#!/bin/python
print "hello world"

种类

  1. 内建命令(cd)
  2. shell函数
  3. 外部命令(find grep echo.sh)

调用过程

  • 调用POSIX系统fork函数接口,创建一个命令行shell进程的复制(子进程)
  • 在紫禁城运行环境中,查找外部命令在Linux文件系统的位置。如果外部命令给出了完全路径,则忽略查找这一步。
  • 在子进程里,以新程序取代shell拷贝并执行(exec),此时父进程休眠,等待子进程执行完毕
  • 子进程执行完毕后,父进程接着从终端读取下一条命令

使用source执行shell脚本不会创建子进程,而是在父进程中直接执行。

echo 转义字符

  • \a :报警符
  • \b :退格符
  • \c :禁止尾随
  • \f :换页符
  • \n :换行符
  • \r :回车符
  • \t :水平制表符
  • \v :垂直制表符
  • \\ :反斜线

常见环境变量

  • HOME 用户的专属目录
  • PATH 外部命令的搜索路径
  • COLUMNS 命令编辑模式下可使用命令行的长度
  • EDITOR 默认的行编辑器
  • VISUAL 默认的可视编辑器
  • FCEDIT 命令fc使用的编辑器
  • HISTFILE 命令历史文件
  • HISTSIZE 保存历史命令记录的条数
  • HISTFILESIZE 命令历史文件中包含的最大行数
  • IFS 定义shell使用的分隔符
  • LOGNAME 当前用户的登录名
  • HOSTNAME 主机名称
  • SHELL 当前使用的shell类型
  • LANG/LANGUAGE 语言
  • MAIL 邮件存放目录
  • MAILCHECK shell检查MAIL文件的周期,单位秒
  • TERM 终端类型
  • TMOUT shell自动退出的时间,秒。若设为0,则禁止shell自动退出
  • PROMPT_COMMAND 指定在主命令提示符前应执行的命令
  • PS1/PS2 PS1是基本提示符,root用户是#,普通用户是$。PS2是负数提示符,默认是>
  • PS3/PS4 select的命令提示符/调试命令提示符
  • MANPATH 寻找手册页的路径,冒号分隔
  • LD_LIBRARY_PATH 寻找库的路径,冒号分隔

shell编程基础

变量

add1=100
add2=200
echo $((add1+add2))
echo $add1
echo ${add1}
let "uninit+=5"
echo "$uninit"

【export】
export [-fnp][变量名称] =[变量设置值]
export命令用于设置或显示环境变量。

  • -f 代表[变量名称]中为函数名称
  • -n 删除指定的变量。变量实际上并未删除,只是不会输出到后续指令的执行环境中。
  • -p 列出所有的shell赋予程序的环境变量。

启动文件

  • /etc/profile 系统范围
  • /etc/bashrc 系统范围,特定于bash
  • $HOME/.bash_profile 用户环境
  • $HOME/.bashrc 用户定义的bash初始化
  • $HOME/.bash_logout 登出(Bash)shell

【env】
env [OPTION]... [-] [NAME=VALUE]... [COMMAND [ARG]...]
在重建的环境中运行程序,设置环境中的每个NAME为VALUE,并运行COMMAND

  • -i, --ignore-environment 清空所有父shell继承来的环境变量
  • -u, --unset=NAME 从环境中删除一个变量
env -i PATH=./:$path echo.sh

【unset】

unset [-v] variable ...
unset -f function ...

从当前shell删除变量或函数

  • -f 删除制定的函数
  • -v 删除指定的变量。(默认)

传参

testfunction(){
    echo "$# params"
    echo "$@"
}
testfunc a b c
# 3 parameters

引用参数

  • 0,1,2...,9 位置参数
  • * 以一个单字符串显示所有参数
  • @ 从参数1开始,显示所有参数
  • # 参数数量
  • $ 脚本运行的当前进程ID
  • ! 后台运行的最后一个进程ID
  • ? 显示最后命令退出状态,0表示没有错误,其他表示有错误
  • - 显示shell时候用的当前选项,与set命令功能相同

【mv】

mv [option] ... Source Dest
mv [options] ... Source Directory
  • -E

    • force 文件固定范围大小或空间保留无法保存,则操作失败
    • ignore 忽略任何错误
    • warn 若无法保存则警告
  • -f 覆盖不提示
  • -i 移动前提示

【mkdir】
mkdir [ -m Mode ] [ -p ] Directory ...

  • -m Mode 设置新创建目录的许可位 和chmod的Mode参数一样
  • -p 创建丢失中间路径名称目录

io重定向

【cat】
cat [-q] [-r] [-s] [-S] [-u] [-n [-b]] [-v [-e] [-t]] [- | File...]

  • -b 当与-n一起指定时,省略来自空行的行号
  • -e 当与-v一起指定时,在每行末尾显示一个$
  • -n 显示在行号之后的输出行,按顺序从1开始编号
  • -q 如果cat命令无法找到输入文件,则不显示消息。该标志等同于-q
  • -r 以一个空行来代替多个连续的空行。该标志等同于-S
  • -s 如果cat 命令无法找到输入问价,则不显示消息。该标志等同于-q标志
  • -S 以一个空行来替代多个连续的空行。该标志等同于-r标志
  • -t 如果与-V一起指定,则将跳格字符显示为^I
  • -u 不要缓冲输出
  • -v 将非打印字符显示为可视字幅
  • 当与-v一起使用时,可使用:

    • -e 将在新航之前的每行末尾
    • -t 跳格符打印成^I,换页符打印成^L
    • - 允许cat命令的标准输入

管道重定向

  • >改变标准输出
echo "redirect to file." >/tmp/a.txt
  • <改变标准输入
cat </tmp/a.txt > /tmp/.b.txt
  • >>追加文件
for line in /etc/passwd
do
    echo $line >> /tmp/b.txt
  • |建立管道
head -n10 /etc/passwd | grep "prince"

【head】
head [ -Count | -c Count | -n Number ] [ File ...]

  • -Count 从每一个要显示的指定文件的开头指定行数。
  • -c End 指定要显示的字节数。
  • -n Number 指定每一个要显示的指定文件的开头行数。

文件描述符 - 非负整数。内核利用文件描述符访问文件。
文件描述符表 - 用户区的一部分,只能通过文件描述符的函数访问。包含进程中每个打开的文件条目。
系统文件表 - 所有进程共享,每条包含文件偏移量、读写模式、指向它的文件描述符表的条目计数。
内存索引节点表 - 包含每个活动文件,几个系统文件表条目可能对应同一个内存索引节点表

  • /erv/null 所有写入它的内容会丢失,读取则为空
#! /bin/sh
# 自动删除cookie,并禁止以后网站再写入cookie
if [ -f ~/.mozilla/cookies]
then
    rm -f ~/.mozilla/cookies
fi
ln -s /dev/null ~/.mozilla/cookies
  • /dev/zero 创建交换文件
#!/bin/bash
ROOT_UID=
E_WRONG_USER=
FILE=/swap
BLOCKSIZE=1024
MINBLOCKS=40
SUCCESS=0

if ["$UID" -ne "$ROOT_UID"]
then
    echo;echo "must be root";echo
    exit $E_WRONG_UESR
fi
blocks=${1:-$MINBLOCKS}
if ["$blocks" -lt $MINBLOCKS]
then
    blocks=$MINBLOCKS
fi
echo "Creating swap fil eof size $blocks blocks (KB)."
dd if =/dev/zeero of=$FILE bs=$BLOCKSIZE count=$blocks
mkswap $FILE $blocks
swapon $FILE
echo "Swap file created and activated"
exit $SUCCESS
  • dev/tty 输出到此的信息只会显示在当前工作的终端上
printf "Enter new passwd"
stty -echo
read pass < /dev/tty
printf "Enter again"
read pass2 < /dev/tty
stty echo

【read】
从标准输入中读取一行
read [-p] [-r] [-s] [-u [n]] [VariableName?Prompt] [VariableName ...]

  • -p 文件结束符引起该进程的清除,因此产生另外一个进程
  • -r 把一个\ 处理为输入行的一部分,而不是控制字符
  • -s 把输入作为一个命令保存在shell历史记录文件总
  • -u[n] 读取一位数的文件描述符号码n作为输入 n默认=0,表示键盘,2表示标准错误
  • VariableName?Prompt 指定一个变量的名称和一个要使用的提示符
  • VariableName 指定一个或多个由空格分隔的变量名

文本检索

【grep】
grep [-E |-F] [-i] [-h] [-s] [-v] [-w] [-x] [-y] [ [[-b][-n]] | [-c|-l|-q] ] [-p [Separator] ] {[-e PatternList ...] [-f PatternFile...]| PatternList...}[File...]

  • -b 在每行之前添加找到改行时所在的块编号
  • -c 只显示匹配行的计数
  • -E 每个模式视作正则
  • -ePatternList 指定一个或多个搜索模式
  • -F 每个模式视作字符串
  • -f PatternFile 指定包含搜索模式的文件 ,换行符分隔
  • -h 禁止在匹配行后附加包含此行的文件名称
  • -i 忽略字母大小写
  • -l 只列出包含匹配行的文件名称
  • -n 在每一行之前放置文件中相关的行号ß
  • -p[Separator] 显示包含匹配行的整个段落,段落之间按照Separator分隔
  • -q 禁止所有写入到标准输出的操作
  • -s 禁止文件不存在/不可读写的错误信息
  • -v 显示所有与指定模式不匹配的行
  • -w 单词搜索
  • -x 显示与指定模式精确匹配而不含其它字符的行
  • PatternList 多个模式
  • File 文件名,默认是标准输入

【ls】
ls [-A] [-C] [-F] [-a] [-c] [-d] [-i] [File ...]
ls -f [-C] [-d] [-i] [-m] [-s] [-x] [-l] [Directory ...]

  • -A 列出所有条目,除了.,..
  • -a 列出所有条目
  • -c 使用索引节点最近一次修改的时间,用于排序/显示
  • -C 以多列纵向排序输出
  • -d 仅显示指定目录信息
  • -F 如果是目录,后缀'/',可执行后缀*,套接字=,FIFO|,符合链接@
  • -i 如果是符号链接,打印所连接到的文件的路径名

变量

替换运算符

  • ${varname:-word} 如果varname存在且非空,返回varname的值,否则返回word
  • ${varname:=word} 如果varname存在且非空,返回varname的值,否则将其置为word,返回其值
  • ${varname:?message} 如果varname存在且非空,返回varname的值,否则打印message,并退出当前脚本
  • ${varname:+word} 如果varname存在且非空,返回word,否则返回null

模式匹配运算符

  • ${varname#pattern} 删除开头最短,返回剩下
  • ${varname##pattern} 删除开头最长,返回剩下
  • ${varname%pattern} 删除结尾最短,返回剩下
  • ${varname%%pattern}删除结尾最长,返回剩下
  • ${varname/pattern/string} ${varname//pattern/string} 将varname中匹配模式的最长部分替换为string
echo "the number of parameter is $# " #输出变量的个数
echo "the return code of last command is $?" #输出上条命令的结束值
echo "the script name is $0" #输出命令的名字
echo "the parameters area $* " #输出命令的所有参数
echo "\$1=$1;\$2=$2"#输出变量,转义字符
if [$# -ne 2]; #判断运行参数,如果不是2,显示用法帮助
then
    echo "Usage:$0 string file";#$0表示脚本自己
    exit 1;
fi
grep $1 $2;# 用grep在$2文件中查找$1字符串

if[$? -ne 0];#判断前一个命令返回值
then
    echo "Not Found \"$1\" in $2";
    exit 1;
fi
echo "found \"$1\" in $2";

shift

while [ -e $1];
do
    cat $1
    Shift
done

函数

【type】
type CommandName ...
解释指令

条件

if condition
then
    statements
[elif condition
then statements...]
[else
statements ]
fi

退出状态值

  • 0 成功
  • >0 在重定向或单词展开前期间(~、变量、命令、算数展开、单词切割)失败
  • 1~125 命令退出失败。特定退出值的定义
  • 126 命令找到但无法执行命令文件
  • 127 命令无法找到
  • >128 命令因受到信号而死亡
exit 42

逻辑运算:&&||!

【test】
test Expression[Expression]
评估Expression参数,若表达式值为True,返回一个零(true)退出至,否则返回非零(false)退出值,如果没有参数也返回非零退出值。

字符串比较

  • = 匹配
  • !=不匹配
  • < 小于
  • > 大于
  • -n str1 非null
  • -z str1 null
#测试一个文件是否存在且非空
if test ! -s "$1"
then
    echo $1 does not exitst or is empty
fi

#若少于2个参数或$1文件不存在,则退出
if [ $# -lt 2 -o ! -e "$1"]
then 
    exit
fi

#判断用户是否存在
line=|grep $1 /etc/passwd |
if [-z line]
    echo "user $1 exists."
fi

文件属性检查

  • -b file 块设备文件
  • -c file 字符设备文件
  • -d file 目录
  • -e file 存在
  • -f file 一般文件
  • -g file 有设置它的setgid位
  • -h file 符号链接
  • -L file 同 -h
  • -p file 管道
  • -r file 可读
  • -S file 套接字
  • -s file 非空
  • -u file 有设置它的setuid位
  • -w file 可写
  • -x file 可执行,如果是目录则可被查找
  • -O file 所有者
  • -G file 组id匹配你的id
  • file1 -nt file2 file1比file2新
  • file1 -ot file2 file1比file2旧

case

case expression in 
    pattern1)
        startements;;
    pattern2)
        statements;;
    pattern3 | pattern4)
        startements;;
case $1 in
    -f)
        ...
    -d)
        ...
esac
case $1 in
    *.jpg) gqview $1;;
    *.txt) gvim $1;;
    *.avi|*.wmv) mplayer $1;;
    *.pdf) acroread $1;;
    *) echo $1;;

循环

for name [in list]
do
    ...
done
for file in `find . -ianme "*.mp3"`
do
    mpg123 $file
done
for file in *.mp3
do
mpg123 $file
done
for name 
do
    case $name in
        -f) ...
        -d) ...
    esac
done
while condition
do
    statements
done
until condition
do
    statements...
done
#遍历PATH路径
path=$PATH:
while [-n $path];
do
    ls -ld ${path%%:*}
    path=${path#*:}
done
#无线循环
path=$PATH
while true
do
    if [-z $path]
    then
        break
    fi
    ls -ld ${path%%:*}
    path=${path#*:}
#跳出循环
while condition1
do ...
    while condition2
    do ...
        break2
    done
done
...
#命令行参数处理
author=false
list=false
file=""

while [$#  -gt 0]
do
    case $1 in
    -f) file=$2
        shift
        ;;
    -l) list=true
        ;;
    -a)    author=true
        ;;
    --) shift
        break
        ;;
    -*) echo $0:$1:unrecognized option
        ;;
    esac
    shift
done

【getopt】
getopt Format Tokens
分析命令标志和参数

#getopt使用
author=false
list=false
file=""

while getopt alf: opt
do
    case $opt in
    f) file=$OPTARG
        ;;
    l) list=true
        ;;
    a) author=true
        ;;
    esac
done
shift ${{OPTIND -1}}

正则

grep

ls -l | grep '^a'
grep 'test' d*
grep 'test' aa bb cc
grep '[a-z]\{5\}' aa
grep 'w\(es\)t.*\1' aa
#后向引用
#匹配 abcdabcd,abcdeabcd,abcdfabcd
\(ab\)\(cd\)[efg]*\1\2
#匹配一行中前后出现两个go
\(go\).*\1

文本

排序

【sort】
sort [arg] [File ...]
排序
-k [FStart [.Cstart]][Modifier] [FEnd [.CEnd]][Modifier]
[+FSkip1 [.CSkip1]][Modifier] [ -[FSkip2] [.CSkip2] [Modifier] ]

  • -A ASCII排序
  • -b 忽略前导空格和制表符,找出字段的第一或最后列
  • -c 检查输入的排序是否正确,否则返回非零值
  • -d 字典顺序(字母数字空格)
  • -f 转大写
  • -I 忽略非打印字符
  • -k KeyDefinition 指定排序关键词
  • -m 合并多个输入
  • -n 按数字值排序
  • -o 输出文件
  • -r 颠倒顺序
  • -t Character 指定Charactor 为单一的字段分隔符
  • -u 同行合并
  • -T Directory 将创建的所有临时文件放入Directory
  • -y [Kilobytes] 指定主存储千字节
  • -z RecordSize 防止排序行大于默认缓冲区大小出现异常种植。RecordSize必须大于等于最长行额字节值
#ASCII排序
LANG=En_YS sort fruits.txt

#字典序
sort -d fruits.txt

#忽略大小差异
sort -d -f -u fruits.txt

#字段排序
sort -t: -k3 -n /etc/group

去重

【uniq】
uniq [-c|-d|-u] [InFile [OutFile]]
去重

  • -c 显示出现的次数
  • -d 仅显示重复行
  • -u 仅显示不重复的行

统计

【wc】
统计文本行数、字数、字符数

wc /etc/passwd
#l w c path
wc -l /etc/passwd
# 行
wc -w /etc/passwd
#单词
wc -c /etc/passwd
#字符

打印

【pr】
pr [options] [files]

pr -c5 -t /tmp/linux.wiki
  • -c N N栏输出
  • -t 不显示标题
  • -a 行列翻转显示
  • -d 产生2个空格的输出
  • -F 用一个填写表格的字符开始新的一页
  • -f-F
  • -h Header 用指定头字符串作为页眉
  • -l Lines 设置页长度,若小于头尾深度,头尾取消
  • -m 合并文件
  • -o Offset 缩进,默认0
  • -t 不显示5行的标识头和5行的页脚
  • -w Width 设置行到列的宽度,适用于多个文本列的输出

【fmt】
fmt [-cstu][-p<列起始字符串>][-w<每列字符数>][--help][--version][文件...]

  • -w<每列字符数> 每行最大字符
  • -s--split-only 只拆开数字超出每列字符数的列,但不合并字数不足的列
  • -c--crown-margin 每段前两列缩排
  • -p<列起始字符串>-prefix=<列起始字符串> 仅合并含有指定字符串的列
  • -t--tagged-paragrapth 每列前两列所拍,但第一列和第二列的所拍格式同
  • -u--uniform-spacing 每个字符之间都空一格,每个句子之间空2格

【fold】
fold [-b] [-a] [-w Width] [File...]
限制文本宽度

  • -w <width> 限制文本宽度
  • -b 按字节计数宽度,默认是按列。
  • -s 使得每个输出行段尽可能宽

提取

【head】
head [-Count | -c Count | -n Number] [File...]

  • -Count 指定行数等价于-n Number
  • -c End 指定显示的字节数
  • -n Number 指定开头行数

字段处理

【cut】

cut -c list [file...]
cut -f list [-d delim] [file...]

剪切字节字符字段

  • -b List 指定字节位置
  • -c List 指定字符位置
  • -d Character 指定字符作为指定-f标志时的字段定界符
  • -f List 指定文件中设想被定界符隔开的字段的列表
  • -n 取消分隔多字节字符,仅和-b一起使用
  • -s 取消不包含定界符的行。仅和-f一起使用

【join】
join [-a FileNumber|-v FileNumber] [-e String][-o List][-t Character][-1 Field][-2 Field] File1 File2

  • -1 FieldFile1的Filed变量指定的字段来链接
  • -2 FieldFile2的Filed变量指定的字段来链接
  • -a FileNumber 以FileNumber(1|2)为准
  • -e String用String指定的字符串来代替空输出字段
  • -o List 构造一个输出航来包含由List指定的字段

    • FileNumber.Field
    • 0
  • -t Character 作为分隔符 默认空格
  • -v FileNumber 指定的文件每一行产生一个输出行,此变量的连接字段和其他输入文件任何一行都不匹配

文本替换

【tr】

tr [ -c| -cds|-cs|-C|-Cds|-Cs|-ds|-s] [-A] String1 String2
tr {-cd|-cs|-Cd|-Cs|-d|-s} [-A] String1
  • -A ASCII整理顺序
  • -C String1值用String1的补码替换
  • -c
  • -d 删除包含String1指定的每个字符
  • -s 在重复字符序列中除去第一个字符以外所有的字符
#小写转大写
tr 'a-z' 'A-z' <linux.wiki>linux.wiki.upper
#大括号转为小括号
tr '{}' '()' < textfile > newfile
#大括号转方括号
tr '{}' '\[]' < textfile > newfile
#创建一个文件中的单词列表
tr -cs '[:lower:][:upper:]' '[\n*]' < textfile > newfile
#删除空字符
tr -d '\0' < textfile > newfile
#用单独的换行替换每一序列的一个或多个换行
tr -s '\n' < textfile > newfile
#用“?”替换每个非打印字符
tr -o '[:print:][:cntrl:]' '[?*]' < textfile > newfile
#用单个“#”替换<space>字符类中的每个字符序列
tr -s '[:space:]' '[#*]'
cut -d ' ' -f 2,3 record.txt|sort|uniq -c|sort -r |head -n100

文件

文件
【ls】

ls [arg] [File...]
ls -f [arg] [Directory...]
  • -a 列出目录下所有文件,包括以.开头的文件
  • -b 把文件名中不可输出的字符用反斜杠加字符编号的形式列出
  • -c 输出文件的i节点的修改时间并以此排序
  • -d 将目录像文件一样显示,而不是显示其下的文件
  • -e 输出时间的全部信息
  • -f -U 对输出的文件不排序
  • -I 输出文件的i节点的索引信息
  • -k 以k字节的形式表示文件的大小
  • -l 列出文件的详细信息
  • -m 横向输出文件名,并以“,“作分隔符
  • -n 用数字的UID,GID代替名称。
  • -o 显示文件除组信息外的详细信息
  • -p -F 在每个文件名后附上一个字符,以说明该文件的类型,”*“表示可执行的普通文件;“/”表示目录”@“表示符号链接;”|“表示FIFOs;"="表示套接字(sockets)
  • -q 用?代替不可输出的字符
  • -r 对目录反向排序
  • -s 在每个文件名后输出该文件大小
  • -t 以时间排序
  • -u 以文件上次被访问的时间排序
  • -x 按列输出,横向排序
  • -A 显示除”.”和“..”以外的所有文件
  • -B 不输出以“~”结尾的备份文件
  • -C 按列输出,纵向排序
  • -G 输出文件的组信息
  • -L 列出链接文件名而不是链接到的文件
  • -N 不限制文件长度
  • -Q 把输出的文件名用双引号括起来
  • -R 列出所有子目录下的文件
  • -S 以文件大小排序
  • -X 以文件的扩展名(最后一个.后的字符)排序
  • -1 一行只输出已给文件
  • --color=no 不显示彩色文件名

文件类型

  • - 普通文件
  • d 文件夹
  • b 块设备文件
  • c 字符设备文件
  • l 软连接文件
  • s 套接字文件

文件的权限

  • OWNER 所有者
  • GROUP 用户组
  • OTHER 其他用户
  • r 4
  • w 2
  • x 1
  • - 0

【chown】

chown [-f] [-h] [-R] Owner [:Group] {File...|Directory...}
chown -R [-f] [-H|-L|-P] Owner {:Group] (File...|Directory...} 
  • -f 禁止除用法消息之外的所有错误消息
  • -h 更改遇到的符号链接的所有权,而非符号链接指向文件或目录的所有权
  • -H 如果指定了-R,?
  • -L 如果指定了-R,?
  • -P 如果指定了-R,?
  • -R 递归地降序目录

【chgrp】

chgrp [-f] [-h] [-R] Group {File...|Directory...}
chgrp -R [-f] [-H|-L|-P] Group {File...|Directory...}
  • -f 消除用法消息以外的所有错误消息
  • -h 更改遇到的符号链接的组所有权,而非通过符号链接所指向的文件或目录的组所有权
  • -H 如果指定了-R,?
  • -L 如果指定了-R,?
  • -P 如果指定了-R,?
  • -R 递归降序目录

【chmod】

chmod [-R][-h][-f][[u][g][o]|[a]] {{-|+|=}[r][w][x][X][s][t]}{File...|Directory...}
  • -f 禁止所有错误报告
  • -h 禁止遇到的符号链接指向的文件或目录的方式更改
  • -R 递归

【touch】

touch [-a][-c][-m][-f][-r RefFile][Time|-t Time]{File...|Directory...}

--a 更改File指定文件的访问时间
--c 如果文件不存在,则不要进行创建
--f 尝试强制touch运行,而不管文件的读写权限
--m 更改File的修改时间
--r RefFile 使用由RefFile变量指定的文件的相对应时间
Time MMDDhhmm[YY]

  • -t Time [[CC]YY]MMDDhhmm[.SS]

寻找

【find】

find pathname -options [-print -exec -ok...]
  • pathname 路径
  • -print 输出到标准输出
  • -exec 执行该参数所给出的shell命令
  • -ok 和exec相同,更为安全的模式
  • -name 按照文件名查找文件
  • -perm 按照文件权限来查找文件
  • -prune 不在当前指定的目录中查找
  • -user 按照文件属主来查找文件
  • -group 按照文件所属的组来查找文件
  • -mtime -n +n 按照文件的更改时间来查找文件 -n表示文件更改时间距现在n天以内+n表示文件更改时间距现在n天以前。find命令还有-atime和-ctime选项,但他们都和-mtime选项类似
  • -nogroup 查找无有效所属组的文件
  • -nouser 查找无有效属主的文件
  • newer file1 ! file2 查找更改时间表文件file1新,但比文件file2旧的文件
  • -type 查找某一类型的文件
  • -size n:[c]查找文件长度为n块的文件
  • -depth 首先查找当前目录中的文件,再在其子目录中查找
  • -fstype 查找位于某一类型文件系统中的文件
  • -mount 不跨越文件系统mount点
  • -follow 如果find命令遇到符号链接文件
  • -cpio 对匹配的文件使用cpio命令

比较

【comm】

  • -1 不显示只在第1个文件里出现过的列
  • -2 不显示只在第2个文件里出现过的列
  • -3 不显示只在第1个和第2个文件里出现过的列

【diff】

#比较2个文件的内容
diff [-c|-C Lines|-D[String]|-e|-f|-n][-b][-i][-t] File1 File2
diff [-h][-b] File1 File2
#排序字典的内容并比较不同的文件
diff [-c|-C Lines|-e|-f|-n] [-b] [-i] [-l] [-r] [-s] [-S File] [-t] [-w] Directory1 Directory2
diff [-h][-b] Directory1 Directory2

--clines 启动diff命令,但只比较lines变量指定的行数。
--c 比较3行上下文
--d [string] 使得diff命令在标准输出上建立一个file1和file2的合并版本,包含了c预处理器控件,以便没有定义string的结果编译等同于编译file1,同时定义string产生file2
--e 以适合ed编辑器的格式进行输出,将file1转换成file2。
--f 以不适合ed编辑器的格式创建输出,按照在-e标志下产生的逆向顺序显示从fikle1到file2转换的必要修改。
--h 如果要更改的部分比较短,而且分隔清晰
--i 忽略大小写
--l翅膀输出格式
--n 产生类似-e的输出,但顺序相反,而且在每一插入或删除命令上进行更改计数
--r 使diff命令的应用程序递归到遇到公共子目录
--s 报告相同的文件,否则不提
--s[file] 当比较目录时,忽略在file变量指定的文件之前整理名称的文件
--t 在输出行扩展制表符
--w 忽略所有空格和制表符

vimdiff file1 file2

文件系统

ext2:早期使用的,支持undelete,大文件
ext3:用于linux的日志文件系统,支持大文件,不支持undelete
reiserfs:都支持

/bin 引导启动所需的命令或普通用户可能用的命令
/sbin 类似/bin,但不给普通用户使用,虽然如果必须要且允许时可以使用
/etc 特定机器的配置文件
/root root用户的家目录
/lib 根文件系统上的程序所需的共享库
/lib/modules 核心可加载模块
/dev 设备文件
/tmp 临时文件
/boot 引导加载器使用的文件
/mnt 系统管理员临时mount的安装点
/proc,/usr,/home 其他文件系统的安装点

/etc/rcor,/etc/rc.dor,/etc/rc*.d 启动或改变运行级时运行的scripts
/etc/passwd 用户数据库
/etc/fdprm 软盘参数表,同setdfprm设置
/etc/fstab 启动时mount -a 命令自动mount的文件系统列表
/etc/group
/etc/inittab init的配置文件
/etc/issue getty在登录提示符前的输出信息
/etc/magic file的配置文件
/etc/motd 成功登录后自动退出,用于通告信息,如计划关机时间的警告
/etc/mtab 当前安装的文件系统列表
/etc/shadow 影子口令软件的口令文件
/etc/login.defs login命令的配置文件
/etc/printcap 打印机
/etc/proflie,/etc/csh.login,/etc/csh.cshrc 登录或启动时只需的文件
/etc/securetty 确认安全终端
/etc/shells 可信任的shell
/etc/termcap 终端性能数据库

/dev 谁被文件
/usr/X11R6 Xwindow系统的所有文件
/usr/X386 X11Release5的
/usr/bin 用户命令
/usr/ 根文件系统不必要的系统管理命令
/usr/man,/usr/info,/usr/doc 手册页、GNU信息文档等
/usr/include c头文件
/usr/lib 程序或子系统不变的数据文件
/usr/local 本地安装的软件和其他文件

/var/catman 要求格式化时man的cache
/var/lib 系统正常运行时要改变的文件
/var/local 安装的程序的可变数据
/var/lock 锁定文件
/var/log 各种程序的log
/var/run 保存到下次引导前有效的系统信息文件
/var/spool mails,news,打印队列和其他队列工作的目录
/var/tmp 比/tmp允许的大或需要存在较长时间的临时文件

/proc是一个假的文件系统,由核心在内存中产生,提供系统信息

【mkfs】
mkfs [-b Boot] [-l Label] [-i i-Nodes] [-o Options] [-p Prototype] [-s Size] [-v VolumeLabel] [-V VfsName] Device
在一个指定的设备上制作一个新的文件系统:初始化卷标,文件系统卷标和启动块

-b Boot 命名要在新文件系统的块0安装的程序
-i i-Nodes 指定文件系统上i-nodes的初始数量
-l Label 文件系统标号
-o Options 指定用逗号分隔的虚拟文件系统

mount
mount [-f] [-n Node] [-o Options] [-p] [-r] [-v VfsName] [-t Type| [Device|Node:Directory] Directory|all|-a][-V[generic_options] special_mount_points

使文件系统可用

-a 包含true安装属性的节
-f 在系统初始化时请求强制安装
-n node指定保留安装目录的远程节点

流编辑

sed

awk

进程

工具

ssh
screen
vim

日志清理程序

系统监控程序

《linux shell编程从入门到精通》


seasonley
607 声望693 粉丝

一切皆数据