设为首页 收藏本站
查看: 1031|回复: 0

shell基础脚本

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2015-9-16 08:54:18 | 显示全部楼层 |阅读模式
echo -e "\e[1;42m this is test \e[0m"            'this is test'会被彩色打印,其中颜色由42m决定
echo -n this is test                    'this is test'不会被换行
printf "%-4s %-5.1f\n"    wade 3.1            wade 3.1分别按照左对齐打印出来,并采用4s和5.1f格式


pgrep gedit                        可以查看到gedit的进程ID

export命令用来设置环境变量。至此以后,从当前shell脚本执行的任何程序都会继承这个变量
export PATH="$PATH:/home/user/bin"            在PATH中新加一条路径

var=1234567890
length=${#var}
echo $length                        获得变量的长度

echo $SHELL或者echo $0                    识别当前的shell版本

echo $UID                        如果结果为0,标示当前为root用户

echo $PS1                        显示当前bash的提示字符串,其中\u为用户名,\h为主机名,\w为当前的工作目录。

可以利用\e[1;32m设置彩色提示字符串



算数操作:

no1=4
no2=5
let result=no1+no2                    let命令可以直接执行基本的算数操作
let no1+=6
echo $result
echo $no1

result=$[no1+no2]
result=$[no1+100]                    可以使用[]操作符,和let命令类似

result=$((no1+10))                    也可以使用(())操作符,但是变量名之前需要加上$

result=`expr 3 + 4`
result=$(expr $no1+5)                    expr也可以用作类似算数操作

echo "4 * 0.45" | bc                    bc执行浮点数运算
echo "scale=2;3/8" | bc                    scale设置小数精度,scale=2表示将小数位个数设置为2

no=100
echo "obase=2;$no" | bc                    利用obase进行进制转换
no=1100100
echo "obase=10;ibase=2;$no" | bc            obase和ibase配合进行进制转换

echo "sqrt(100)" | bc                    sqrt计算平方根
echo "10^10" | bc                    ^计算平方


文本描述符:
0    stdin
1    stdout
2    stderr

echo "this is test" >temp.txt
echo "this is test 1" >>temp.txt            >等同于1>;>>等同于1>>

当命令输出错误信息时,stderr信息就会被打印出来。当一个命令发生错误并退回时,它会返回一个非0的退出状态;而当命令成功完成后,它会返回数字0。
退出状态可以从特殊变量$?中获得。

ls + 2>out.txt                        将错误输出到out.txt文件中
cmd 2>stderr.txt 1>stdout.txt                将stderr单独定向到一个文件中,将stdout重定向到另一个文件中
cmd &>output.txt                    将stderr和stdout都被重定向到同一个文件中

command | tee [-a] FILE1 FILE2                在终端中打印,并将它重定向到文件FILE1和FILE2.-a表示为追加内容选项

exec 3<input.txt                    exec命令创建自定义的文件描述符




数组和关联数组
array_var=(1,2,3,4,5)                    定义数组,以0位起始索引
array_var[0]="test"                    自定义数组
echo ${array_var[0]}                    打印出特定索引的数组元素内容
echo ${array_var
  • }                    打印所有数组的内容
    echo ${#array_var
  • }                    打印数组长度

    declare -A ass_array                    定义关联数组
    ass_array=([index1]=val1 [index2]=val2)            内嵌索引-值列表法
    ass_array[index1]=val3                    独立的索引-值
    echo ${ass_array[index1]}                打印index1索引对应的值
    echo ${!ass_array
  • }                    列出数组索引


    alias new_command='command sequence'            创建新的别名。要想永久保存,需要将其放入到~/.bashrc文件中。若想删除只需要使

    用unalias命令或者从~/.bashrc中删除


    tput cols                        获取终端的行数
    tput lines                        获取终端的列数
    tput longname                        打印出当前终端名
    tput setb [0-7]                        设置终端背景色
    tput bold                        设置字体为粗体

    echo -e "Enter password: "
    stty -echo                        禁止将输出发送到终端
    read password
    stty echo                        允许发送到终端
    echo
    echo Password read



    date                            显示日期
    date +%s                        以纪元时显示时间,主要用途是做时间差的秒数
    date --date "jan 20 2011" +%s                按照给定日期显示纪元时
    date --date "jan 20 2011" +%A                按照给定日期显示是星期几
    %A    星期
    %B    月
    %d    日
    %D    固定格式日期(mm/dd/yy)
    %Y    年
    %H    小时
    %M    分钟
    %S    秒
    %N    纳秒
    %s    纪元时
    date "+%d %B %Y"                    按照指定格式打印时间
    date -s "21 june 2015 11:12:23"                设置日期和时间



    bash -x script.sh                    使用-x选项,启动跟踪调试shell脚本。打印出所执行的每一行命令以及当前状态
    set -x        在执行时显示参数和命令
    set +x        禁止调试
    set -v        当命令进行读取时显示输入
    set +v         禁止打印输入
    #!/bin/bash -xv                        在/bin/bash启动xv,可以启用调试功能




    function fname()
    {
        statements;                    自定义函数。或者去掉function也可以
    }

    fname                            执行函数
    fname arg1 arg2                        执行函数,传递参数
    $1是函数的第一个参数
    $2是函数的第二个参数
    $@是打印所有参数
    $*是以单个实体的方式打印所有参数

    递归函数
    F()
    {
    echo $1;
    F HELLO;
    SLEEP 1;                        SLEEP表示休眠1秒钟
    }

    导出函数
    export -f fname                        导出函数,扩展函数的作用域。可以扩展到子进程


    FORK炸弹
    :() {:|:&};:                        该函数能够调用自身,不断的生成新的进程,最终造成DDOS攻击

    ls | cat -n >out.txt                    列出当前目录下的内容,cat -n追加行号存到out.txt文件中

    pwd
    (cd /bin;ls)                        利用()定义一个子shell
    pwd


    read -n 2 var                        读取2个字符并存入变量var中
    read -s var                        以不回显的方式存入变量
    read -p "enter input:" var                显示提示信息
    read -t timeout    var                    在特定时限内读取输入
    read -d "定界符" var                    用定界符结束输入行


    IFS(内部字段分隔符)        默认为空

    for循环
    for var in list;
    do
    commands
    done

    for ((i=1;i<10;i++));
    do
    commands
    done

    echo {1..50}                        生成一个1到50的数字列表
    echo {a..z}                        生成a..z的列表

    while循环
    while condition
    do
    commands
    done

    until循环
    x=0;
    until [$x -eq 9]
    do
    let x++;echo $x
    done



    if 条件;then
    commands;
    fi

    if 条件;then
    commands;
    elif conditions;
    then
    commands;
    else
    commands;
    fi

    [condition] && action                    如果条件为真,则执行action
    [condition] || action                    如果条件为假,则执行action



    条件判断:
    算术比较
    -eq    等于
    -ne    不等于
    -gt    大于
    -lt    小于
    -ge    大于或等于
    -le    小于或等于
    -a    逻辑与
    -o    逻辑或

    文件系统相关测试
    -f $var    判断var变量是否有文件
    -x    判断是否有可执行文件
    -d    目录
    -e    文件是否存在
    -c    字符设备文件
    -b    块设备文件
    -w    文件是否可写
    -r    文件是否可读
    -L    是否有符号链接

    字符串比较
    [[ $str1 = $str2 ]]                    当str1等于str2时,返回真。就是str1和str2包含的文本是一模一样的
    [[ $str1 == $str2 ]]                    检查字符串是否相等
    [[ $str1 != $str2 ]]                    字符串不同则返回真
    [[ $str1 > $str2 ]]                    字符串1的字母序大于字符串2,返回真
    [[ $str1 < $str2 ]]                    字符串1的字母序小于字符串2,返回真
    [[ -z $str1 ]]                        若str1为空,返回真
    [[ -n $str1 ]]                        若str1内容为非空,则为真

    if [ $var -eq 0 ];then echo "true";fi
    can be written as
    if test $var -eq 0;then echo "true";fi            可以用test命令替代[]符号






    cat 1.sh 2.sh                        拼接1.sh和2.sh文件内容
    cat -s 1.sh                        -s选项压缩1.sh中的连续的空白行
    cat 1.sh | tr -s '\n'                    利用tr移除空白行
    cat -T 1.sh                        将1.sh中的制表符标记成^|



    script -t 2> timing.log -a output.session        timing.log用于存储时序信息,描述命令在何时运行。output.session用于存储命令输出
    exit                            退出录制终端会话
    scriptreplay timing.log output.session            播放录制终端会话

    Terminal1输入以下命令:
    mkfifo    scriptfifo
    Terminal2输入以下命令:
    cat scriptfifo
    返回terminal1,输入以下命令:
    script -f scriptfifo                    
    commands;
    exit                            当退出时,终端1变成广播员,终端2变成听众

    find . -print                        当前目录下打印出匹配文件的文件名(路径)。其中'\n'作为用于分隔文件的定界符
    find . -print0                        '\0'作为定界符

    find . -iname "example*" -print                寻找当前目录下example开头的文件,忽略大小写,并打印出来
    find . \( -name "*.txt" -o -name "*.pdf" \) -print    寻找匹配多个条件中的一个并打印
    find . -path "*slynus*" -print                寻找符合slynus路径
    find . -regex "*slynus*" -print                以正则表达式的方式寻找路径
    find . ! -name "*.txt" -print                当前目录下不是以txt为后缀的文件
    find . -maxdepth 1 -type f -print            maxdepth参数指定寻找最大深度
    find . -mindepth 2 -type f -print            mindepth参数指定寻找最小深度

    -atime    访问时间    用户最近一次访问文件的时间
    -mtime    修改时间    文件内容最后一次被修改的时间
    -ctime    变化时间    文件元数据(例如权限或所有权)最后一次被改变的时间
    其中-表示小于,+表示大于
    -amin    访问时间    以分钟为计时
    -mmin    修改时间
    -cmin    变化时间
    -newer    比较时间    需找比指定文件更新的所有文件

    find . -type f -size +2k                寻找当前目录下文件大小大于2k的文件.
    find . -type f -size -2k
    find . -type f -size 2k
    还可以用b/c/w/k/m/g代替k

    find . -type f -name "*.txt" -delete            删除匹配的文件
    find . -type f -perm 644 -print                基于文件权限匹配
    find . -type f -user slynux  -print            基于文件所有权匹配

    find . -type f -user root -exec chown slynux {} \;    利用exec和{}可以结合find执行命令或动作
    本例的意思是将所有的符合文件全部更改其所有权为slynux用户.其中{}表示为所有符合条件的集合
    find . -type f -mtime +10 -name "*.txt" -exec cp {} OLD \;
    find devel/source_path \( -name ".git" -pruns \) -o \( -type f -print \)  该命令表示打印出不包括在.git目录中的所有文件的名称(路径).使用关键字pruns




    xargs命令把从stdin接收到的数据重新格式化,再将其作为参数提供给其他命令
    cat example.txt | xargs                    xargs将多行输入转换成单行输出。将'\n'符转换成" "(空格)

    cat example.txt    | xargs -n 3                指定每行最大的参数数量n,每个参数都是由" "(空格)隔开

    echo "splitXsplitXsplitXsplit" | xargs -d X -n 2    利用-d选项指定分隔符,默认为IFS作为分隔符

    #cecho.sh
    echo $*'#'                        定义一个文件,当参数被传递给文件后,它会将这些参数打印出来,并以#字符作为结



    #args.txt
    args1
    args2
    args3

    cat args.txt | xargs -n 1 ./cecho.sh            当需要每次提供一个参数时,指定n=1
    cat args.txt | xargs     ./cecho.sh            当需要每次提供所有参数时
    INPUT | xargs -n X                    每次执行脚本需要X个参数的命令时

    ./cecho.sh -p arg1 -l
    ./cecho.sh -p arg2 -l                    arg部分是唯一的可变文本

    cat args.txt | xargs -I {} ./cecho.sh -p {} -l        利用-I选项配合{}指定了替换字符串,可以实现上面的执行命令

    find . -type f -name "*.txt" -print0 | xargs -0 rm -f    删除匹配的文件,其中\0作为输入定界符。

    find source_code_dir_path -type f -name "*.c" -print0 | xargs -0 wc -l        统计源代码目录中所有C程序文件的行数



    tr只能通过stdin,而无法通过命令行参数来接受输入。
    tr [options] set1 set2
    将来自stdin的输入字符从set1映射到set2,并输出到stdout。若set2的长度小于set1,则set2会不断重复其最后一个字符,直到长度与set1相同。如果set2的

    长度大于set1,那么在set2中超出set1长度的那部分字符则完全被忽略

    echo "HELLO WORLD WHO IS THIS" | tr 'A-Z' 'a-z'        将输入字符由大写转换成小写

    echo 12345 | tr '0-9' '9876543210'            加密
    echo 87654 | tr '9876543210' '0-9'            解密

    echo "hello 123 world 456" | tr -d '0-9'        利用-d选项删除字符。本例结果为hello world

    echo hello 1 char 2 next 4 | tr -d -c '0-9 \n'        利用-c选项使用字符的补集,将去除非set1中出现的所有字符。本例结果为 1 2 4

    echo "ssssss" | tr -s 's'                利用-s选项压缩字符。本例压缩s,结果为s

    字符类
    alnum        字母和数字
    alpha        字母
    cntrl        控制(非打印)字符
    digit        数字
    graph        图形字符
    lower        小写字母
    print        可打印字符
    punct        标点符号
    space        空白字符
    upper        大写字母
    xdigit        十六进制字符

    tr '[:lower:]' '[:upper:]'




    md5sum 1.sh > 1.md5                计算1.sh的校验和(32字符,十六进制)并保存到1.md5文件中

    md5sum -c 1.md5                    利用生成的文件核实数据完整性

    md5sum *.md5                    用所有的.md5信息来检查所有的文件

    sha1sum 1.sh > 1.sha1                计算1.shd点校验和(40字符,16进制)

    md5deep -rl directory_path > directory.md5    计算目录的校验和。r表示递归,l表示使用相对路径。需要安装md5deep软件包

    md5sum -c directory.md5                核实目录



    sort file1.txt file2.txt > sort.txt        利用sort将一组文件进行排序

    cat sort.txt | uniq > uniq.txt            利用uniq找出已排序文件中不重复的行

    sort -n file.txt                按数字进行排序

    sort -r file.txt                按逆序进行排序

    sort a.txt -o a.txt                对a.txt的文件排序                        

    sort -M months.txt                按月份进行排序

    sort -nC file.txt                检查是否按照数字进行排序

    sort -m sorted1 sorted2                合并两个排过序的文件,而且不需要对合并后的文件再进行排序

    sort -nrk 1 data.txt                -k指定了排序应该按照哪一个键(列号)来进行排序。

    sort -u unsort.txt                只显示唯一的行
    uniq -u unsort.txt                只显示唯一的行

    sort unsort.txt | uniq -c            统计各行在文件中出现的次数

    sort unsort.txt | uniq -d            找出文件中重复的行

    sort data.txt | uniq -s 2 -w 2            -s指定可以跳过前n个字符,-w指定用于比较的最大字符数

    uniq -z file.txt                用uniq命令生成包含0值字节终止符的输出

    uniq -z file.txt | xargs -0 rm            删除指定的文件



    temp_file=$(tempfile)                为变量temp_file赋值了一个临时文件名
    temp_file="/tmp/file-$RANDOM"            加带了随机数的文件名作为临时文件名

    echo $RANDOM                    总是返回一个随机数

    temp_file="/tmp/var.$$"                生成带当前运行脚本的进程ID的临时文件




    dd if=/dev/zero bs=100k count=1 of=data.file    生成一个大小为100KB的测试文件

    split -b 10k data.file                将文件分割为多个大小为10k的文件

    split -b 10k data.file -d -a 4            -d参数指定以数字为后缀,-a参数指定后缀长度

    split -b 10k data.file -d -a 4 split_file    指定每个分割文件的前缀为split_file

    split -l 10 data.file                -l选项指定分割文件仅有10行

    csplit server.log /SERVER/ -n 2 -s {*} -f server -b "%02d.log";rm server00.log
    /SERVER/    用来匹配某一行,分割过程即从此开始
    {*}        表示根据匹配重复执行分割,直到文件末尾为止。{整数}指定分割执行的次数
    -s        使命令进入静默模式,不打印其他信息
    -n        指定分割后的文件名后缀的数字个数
    -f        指定分割后的文件名前缀
    -b        指定后缀格式
    因为分割后的第一个文件没有任何内容,所以删除第一个文件



    file_jpg="sample.jpg"
    name=${file_jpg%.*}                利用$操作符可以将名称部分从“名称.扩展名”这种格式的文件名中提取出来
    echo File name is :$name

    var=hack.fun.book.txt
    echo    ${var%.*}    -->hack.fun.book        从右到左   
    echo    ${var%%.*}    -->hack                %%符号执行非贪婪匹配

    echo    ${var#*.}    -->fun.book.txt            从左到右
    echo    ${var##*.}    -->txt                ##符号执行非贪婪匹配


    extension=${file_jpg#*.}                利用#操作符可以将扩展名部分提取出来
    echo Extension is : $extension



    rename *.jpg *.JPG                    将*.jpg更名为*.JPG

    目录/usr/share/dict包含了一些词典文件

    命令aspell来核查某个单词是否在字典中

    look android    filepath                返回filepath路径中以android开头的文件/目录

    read -p "Enter number:" no                将输入内容赋值给变量no

    交互式自动化:expect
    #!/bin/bash
    #文件名:interactive.sh
    read -p "Enter number:" no
    read -p "Enter name:" name
    echo you have entered $no,$name;

    #!/usr/bin/expect
    #文件名:automate_expect.sh
    spawn ./interactive.sh                    spawn参数指定需要自动化哪一个命令
    expect "enter number:"                    expect参数提供需要等待的消息
    send "1\n"                        send是要发送的消息
    expect "enter name:"
    send "hello\n"
    expect eof                        expect eof指明命令交互结束



    comm a.txt b.txt                    比较A.TXT和B.TXT的文件。输出的第一列包含只在a.txt中出现的行,第二列只包含在b.txt中出

    现的行,第三列包含共同出现的行
    comm a.txt b.txt -1 -2                    -1从输出中删除第一列,-2从输出中删除第二列,-3从输出中删除第三列

    用户特殊权限:S
    setuid权限允许用户以其拥有者的权限来执行可执行文件,即使这个可执行文件是由其他用户运行的
    用户组特殊权限:S
    setgid位允许以同该目录拥有者所在组相同的有效组权限来允许可执行文件,但是这个组和实际发起命令的用户组未必相同
    其他用户特殊权限:T/t
    粘滞位(sticky bit)。当一个目录设置了粘滞位,只有创建该目录的用户才能删除目录中的文件,即使用户组和其他用户也有写权限
    如果没有设置执行权限,但是设置了粘滞位,那么使用t;如果同时设置了执行权限和粘滞位就使用T

    chmod a+t directory_name                设置粘滞位
    chmod 777 . -R                        以递归的方式设置权限
    chown user.group . -R                    以递归的方式设置所有权
    chmod +s executable_file                以不同的用户运行可执行文件
    chmod u+s file                        置位setuid
    chmod g+s file                        置位setgid

    chattr +i file                        将文件file设置为不可修改
    chattr -i file                        将文件file重新设置为可修改

    touch -a file                        只更改文件访问时间
    touch -m file                        只更改文件内容修改时间
    touch -d "Fri Jun 25 10:20:12 IST 2012" file        -d为时间戳指定特定的时间和日期

    ln -s target symbolic_link_name                创建软连接symbolic_link_name-->target

    file filename                        显示文件类型信息
    file -b filename                    显示不包括文件名在内的文件类型信息





    环回文件系统是指那些在文件中而非物理设备中创建的文件系统

    创建一个1G大小的文件
    dd if=/dev/zero of=loopbackfile.img bs=1G count=1

    格式化这个文件
    mkfs.ext4 loopbackfile.img

    检查文件系统
    file loopbackfile.img

    挂载环回文件
    mkdir /mnt/loopback
    mount -o loop loopback/img  /mnt/loopback

    在内部,这个环回文件连接到一个名为/dev/loop1或者loop2的设备上,手动操作如下
    losetup /dev/loop1        loopback.img
    mount  /dev/loop1      /mnt/loopback

    将ISO文件作为环回文件挂载
    mkdir    /mnt/iso
    mount -o loop linux.iso    /mnt/iso

    通过sync立即应用更改
    sync



    创建ISO镜像
    从/dev/cdrom创建一个ISO镜像
    cat /dev/cdrom > image.iso

    创建镜像的最好方法是用dd工具
    dd if=/dev/cdrom of=image.iso

    mkisofs命令创建iso文件系统
    mkisofs -V "Label" -o image.iso source_dir/
        -V指定了ISO文件的的卷标,source_dir是作为ISO文件内容来源的目录路径




    能够启动闪存或硬盘的混合ISO
    isohybrid命令把标准ISO文件转换成混合ISO
    isohybrid        image.iso  ->可用于写入USB存储设备
    将ISO写入USB存储设备
    dd if=image.iso   of=/dev/sdb1


    命令行刻录ISO
    cdrecord -v  dev=/dev/cdrom  image.iso
        -speed  速度          指定刻录速度
        -multi        刻录方式采用多区段



    玩转CD ROM托盘
    eject          弹出光驱托盘
    eject -t          合上光驱托盘





    查找文件差异并进行修补
    diff  -u  version1.txt version2.txt    以一体化形式输出差距,version2.txt中没有version1.txt的文件被显示。+表示是新加入的行,-表示是删除的行

    diff -u version1.txt version2.txt > version.patch 将diff的输出重定向到一个文件

    patch命令配合version.patch,当应用与version1时,就可以得到version2
    patch -p1 version1.txt  < version.patch        此时version1的内容和version2相同
    patch -p1 version1.txt  < version.patch        再次输入该命令撤销修改

    生成目录的差异信息
    diff  -Naur   directory1  directory2  
        -N:将所有缺失的文件视为空文件
        -a:将所有文件视为文本文件
        -u:生成一体化输出
        -r:遍历目录下的所有文件





    head   -n  4 file    指定打印前几行
    head   -n  -N file    打印除了最后N行之外的所有行
    seq  11   |  head -n -5        打印除了最后五行之外的所有行
    seq  100  | head -n  5    打印前五行

    tail       -n  5 file    打印后五行
    tail       -n  +(N+1)    打印除了前N行之外的所有行
    seq 100 | tail -n +6    打印第六行到第一百行
    tail   -f   file    动态显示文件




    查看当前路径下的目录
    ls -d  */



    用pushd和popd快速定位
    pushd和popd可以用于在多个目录之间进行切换而无需复制粘贴。pushd和popd是以栈的方式来运作,后进先出。
    pushd  /var/www        压入路径
    pushd  /usr/src        压入路径
    pushd  /etc        压入路径
    查看栈内容
    dirs
    切换目录
    pushd  +3    每条路径的编号是以0开始,从左到右
    移除栈内容
    popd            当前目录被移除
    popd    +3        将第三个移除
    cd -            切换到上个目录



    统计行数
    wc -l  file   
    统计单词数
    wc  -w  file
    统计字符数
    wc  -c   file
    默认显示行数、单词数和字符数
    wc  file
    打印最长行的长度
    wc  file  -L




    打印目录树
    tree    -/unixfs        树状UNIX文件系统
    tree    path     -P    pattern     用通配符描述样式
    tree    path    -I    pattern    只重点标出除符合样式之外的文件
    tree    -h            同时打印出文件和目录的大小
    tree    PATH    -H    http://localhost   -o  out.html    以html形式输出目录树




    grep  match_pattern  filename     从文件中搜索

    grep  word  filename  --color    重点标记处匹配到的单词

    grep -E "[A-Z]+"  或者  egrep "[A-Z]+"    正则表达式查找

    grep word -o file            -o选项只输出匹配到文本部分
    grep  -v  word  file            -v选项打印除了匹配外的所有行
    grep  -c  word  file            -c统计匹配行的数量

    grep -c word file | wc -l        wc -l配合-c可以统计匹配项的数量
    grep -n word file            -n选项包含匹配字符串的行数
    grep  word file  -R -n        -R递归搜索

    grep -i word  file            -i忽略大小写

    grep -e word1 word2 file        -e匹配多个样式

    grep dir --include  word        --include搜索中包含文件

    grep dir --exclude word        --exclude搜索排除文件
                    --exclude-dir
                    --exclude-from FILE





    cut按列切分文件

    cut -f 2,3    filename            提取filename文件中2、3列
    cut -f 3 --complement file        提取除了第三列外的所有列
    cut -f 3 -d ";" file            -d指定了定界符

    cut -c 1-5 file            打印前5个字符
    cut -c -5 file            打印前5个字符
    -c    表示字符
    -b    表示字节
    -f    表示定义字段
    N-    从第N个字节到行尾
    N-M    从第N个到第M个
    -M    从第一个到第M个

    cut -c1-3,6-9 file    --output-delimiter ","    指定输出定界符




    sed入门
    sed 's/pattern/replace_string/'  file    替换给定文本中的字符串

    sed -i 's/pattern/replace_string/'  file    将替换结果应用于原文件

    sed '/s/pattern/replace_string/g'  file    替换所有符合内容

    sed 's/pattern/replace/Ng' file    从第N+1处替换

    sed '/^$/d'  file            移除空白行

    sed 's/\w\+/[&]/g'        &对应于之前所匹配到的单词

    sed 'expr1' | 'expr2'    组合多个表达式


    awk入门
    awk  'BEGIN{print "start"}  pattern {commands}  END {print  "end"}'  file

    工作方式:
    1,执行BEGIN {commands}语句块中的语句
    2,从文件中或stdin中读取一行,然后执行pattern {commands}。重复这个过程,直到文件全部被读取完毕
    3,当读至输入流末尾时,执行END {commands} 语句块
    三个语句块都是可选的

    echo -e "line1\nline2" | awk 'BEGIN{print "start"} {print} END{print "END"}'      结果如下:
    start
    line1
    line2
    end

    特殊变量
    NR:表示记录数量
    NF:表示字段数量
    $0:这个变量包含执行过程中当前行的文本内容
    $1:这个变量包含第一个字段的文本内容
    $2:这个变量包含第二个字段的文本内容





    迭代文件中的每一行
    while read line;
    do
    echo $line;
    done < file.txt
    或者
    cat file.txt | (while read line;do echo $line;done)

    迭代一行中的每一个单词
    for word in $line;
    do
    echo $word;
    done
    迭代文件中的每一行的每一个单词
    while read line;
    do
        for word in $line;
        do
        echo $word;
        done
    done < file.txt

    迭代一个单词中的每一个字符
    for ((i=0;i<${#word};i++))
    do
    echo ${word:i:1};
    done



    按列合并文件
    paste  file1 file2
    paste  file1 file2  -d ","    指定定界符,默认为制表符
    按行合并文件
    cat  file1  file2


    打印文件或行中的第n个单词或列
    awk '{print $1}' file
    ls -l | awk '{print $1 ":" $4}'


    打印不同行或样式之间的文本
    awk  'NR==M,NR==N'  filename    打印m行到n行文本
    awk  '/start_pattern/, /end_pattern/' filename    打印pattern之间的文本


    邮件的正则表达式
    [a-zA-Z0-9.]+@[a-zA-Z0-9.]+\.[a-zA-Z]{2,4}



    文本切片与参数操作
    var="this is a line"
    echo ${var/line/replace}    -->this is a replace

    ${variable_name:start_position:length}        -->指定字符串的起始位置和长度来生成子串
    string=abcdefghijklmnopqrstuvwxyz
    echo ${string:4}        -->efghijklmnopqrstuvwxyz
    echo ${string:4:8}        -->efghijkl
    echo ${string:(-1)}        -->x
    echo ${string:(-2):2}    -->yx





    网站下载
    wget    url    下载网页或远程文件
    wget url1 url2
    wget
    wget   -o log -O 1.jpg  -o表示日志,-O表示指定输出文件名
    wget  -t  5  rul    -t指定重试次数
    wget  --limit-rate  20k  url    限速下载
    wget  -Q 100m url        指定下载最大限额
    wget  -c     url        断点续传
    curl   url            下载网页
    wget  --mirror   url        复制或镜像整个网站
    wget  --user  username  --password  pass url    访问需要认证的HTTP或FTP页面


    以格式化纯文本形式下载网页
    lynx  -dump  url > webpage_as_text.txt    将网页以ASCII字符的形式下载到文本文件中



    用curl设置cookie
    curl  url  --cookie  "user=slynx;pass=hack"
    将cookie另存为一个文件
    curl  url  --cookie-jar   cookie-file
    用curl设置用户代理字符串
    curl  url  --user-agent  "Mozilla/5.0"    设置用户代理为IE
    限定curl可占用的带宽
    curl  url  --limit-rate  20k
    指定最大下载量
    crul  url  --max-filesize  30k
    用curl进行认证
    curl  -u  user:pass  url




    tar -cvf output.tar  source1 source2    创建包
    tar -rvf output.tar  new_file        追加文件
    tar -tvf  output.tar            列出包里的内容
    tar -xvf  output.tar            提取包里的内容
    tar -Af  file1.tar  file2.tar        拼接两个包文件
    tar -f    output.tar  --delete file1 file2    从包文件中删除文件
    tar -zcvf  output.tar.gz  source        gzip格式压缩
    tar -jcvf   output.tar.bz2  source        bz2格式压缩
    tar -cvf --lzma  output.tar.lzma        lzma格式压缩
    tar -cf  output.tar  * --execlude "*.txt"    从归档中排除部分文件



    用cpio归档
    echo  file1 file2 | cpio -ov > archive.cpio

    gzip  filename    压缩文件,只能压缩一个文件
    gunzip  filename.gz    解压缩文件
    zcat  filename.gz        读取压缩文件内容
    gzip  -9  filename        压缩率
        1级的压缩率最低,但是压缩速度最快
        9级的压缩率最高,但是压缩率最慢


    bzip2 filename        压缩文件
    bunzip2 filename.bz2    解压缩文件
    bunzip2 filename.bz2 -k    解压缩文件,保留原文件
    bzip2 filename -k        压缩文件,保留原文件


    lzma  filename        压缩文件
    unlzma  filename.lzma    解压缩文件
    lzma  filename -k        压缩保留原文件
    lzma -9 filename        压缩率


    超高压缩率的squashfs文件系统
    mksquashfs  sources  compressedfs.squashfs    创建squashfs文件
    mkdir  /mnt/squash
    mount -o loop  compressedfs.squashfs  /mnt/squash

    加密工具与散列
    crypt   input_file   output_file    接受文件以及口令
    crypt   passphrase  inputfile  encrypted_file
    crypt  passphrase -d encrypted_file > outputfile  解密文件

    gpg  -c  filename            加密文件
    gpg  filename.gpg            解密文件





    列出网络上的所有活动主机
    方法一:
    for ip in 192.168.0.{1..255};
    do
        ping $ip -c 2 &> /dev/null;
        if [ $? -eq 0 ];
        then
            echo $ip is alive
        fi
    done
    方法二:
    fping  -a  192.168.0.1/24 -g 2> /dev/null
    或者
    fping  -a 192.168.0.1 192.168.0.255 -g



    传输文件
    lftp  username@ftphost
        cd directory    改变目录
        lcd          改变本地主机的目录
        mkdir        创建目录
        get filename    下载文件
        put filename    上传文件

    sftp username@domainname
    sftp -oPort=422    user@domainname    SSH端口不是默认的22时,需要指定端口

    scp source destination    安全复制文件
    scp  filename    user@remotehost:/path
    其中src和dst都可以采用形如username@localhost:/path的形式
    scp -r filename     user@remotehost:/path    递归复制


    iwconfig命令用来为无线网卡配置合适的无线网络
    iwlist scan命令可以扫描并列出可用的无线网络


    lsof -i        列出系统中的开放端口以及运行在端口上的服务的详细信息
    netstat -lntp        查看开放端口与服务


    计算命令执行时间
    time  command        计算命令的执行时间
        real时间表示挂钟时间,命令开始到结束的时间
        user时间是指进程花费在用户模式中的cpu时间,真正用于执行进程的时间
        sys时间是指进程花费在内核模式中的cpu时间
       


    watch监视命令
    watch ls    在某段时期内以固定的间隔时间不断监视某个命令的输出
    watch -n 5 'ls -l'    -n指定输出的时间间隔
    watch -d 'ls -l'    -d指定命令输出差异

    对文件及目录访问进行记录
    inotifywait -m -r -e create,move,delete /dev/ -q




    wall命令用来向所有当前登陆用户的终端写入消息
    echo  "test123" | wall
    wall < message



    查看主机名
    hostname    或者uname -n
    打印linux内核版本、硬件架构等详细信息
    uname -a
    打印内核发行版本
    uname -r
    打印主机类型
    uname -m
    打印CPU相关信息
    cat /proc/cpuinfo
    打印内存的详细信息
    cat /proc/meminfo
    打印系统的分区信息
    cat /proc/partions


    cron表的格式,从左到右依次是
    分钟(0-59)、小时(0-23)、天(1-31)、月份(1-12)、工作日(0-6)、命令

    创建cron表:
    crontab -e -u user
    查看cron表:
    crontab -l
    移除cron表:
    crontab -u user -r






    $0    查看当前shell
    $?    命令的返回状态,正常退出为0;非正常退出为非0
    $1    执行脚本时的参数
    $PS1    当前bash提示字符串
    $$    当前进程ID
    $UID    为0表示为root


  • 运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
    2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
    3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
    4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
    5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
    6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
    7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
    8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

    所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-114220-1-1.html 上篇帖子: shell date时间相加减 下篇帖子: 查看linux server网络流量的shell脚本
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    扫码加入运维网微信交流群X

    扫码加入运维网微信交流群

    扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

    扫描微信二维码查看详情

    客服E-mail:kefu@iyunv.com 客服QQ:1061981298


    QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


    提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


    本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



    合作伙伴: 青云cloud

    快速回复 返回顶部 返回列表