Linux基础 笔记(鸟哥私房菜第二版)

1. 常用的命令包括:
        ls 显示文件 -la  显示所有文件
        bc 简单计算器
        date 显示日期时间
        cal 显示日历 加参数可以看指定年月的 cal 7 2015

        man 查看命令帮助
        info 查看命令帮助

        帮助的使用方法:
        空格键 向下翻页
        [Page Up]
        [Page Down]
        Home 第一页
        End 最后一页
        /string 向下搜索字符串string
        ?string 向上搜索字符串string
        n N n继续向下搜索,N继续向上搜索

        whatis 查看命令帮助
2. 文件操作命令
        chgrp 改变文件所属用户组
                chgrp users abc.txt 将abc.txt文件的用户组修改为users。users必须在/etc/group中出现的组名
        chown 改变文件拥有者
                chown bin abc.txt 将abc.txt文件的所有者修改为bin。
        chown /  chgrp两个命令用途不太错,但是也是有用的,比如将文件复制给别的用户时。
        chmod 改变文件的属性等
                chmod 770 abc.txt 将abc.txt的文件属性设置为770
                chmod a+x abc.txt 三个权限都加上执行权限
                a / u / g / o   对应于与所有,用户,组,其他三个
                x / r / w 对应执行,读写

        cd 更换目录        ~ 家目录   ..  上一级   -  上一个工作目录

        pwd 显示工作目录 print working directory  -P 显示实际路径,非链接路径

        mkdir 建立目录         -m 设置权限 后加权限  -p 递归建立
        rmdir 删除 空 目录         -p 与上层空目录一起删除

        $PATH 可执行路径 echo $PATH 显示可执行路径 PATH="$PATH":/root 将/root也添加到可执行路径中

        ls 列举文件
                -a 列举所有的文件,包括隐藏文件
                -A 列举所有文件,但是不包括 . 和 .. 两个文件
                -d 仅仅列举出目录文件 
                -f 直接列举,不排序
                -F 根据文件类型,附加一些字符信息,表示文件类型
                -h 列举文件大小
                -R 与子目录一起列举出来
                -S 按照文件大小排序
                -t 按照时间排序
                -r 将排序 逆向列出来

        cp 复制文件,还可以用来建立连接
                -p 强制使用属性,而非默认的文件属性
                -r 递归复制,用于目录复制
                -s 复制文件为符号链接文件,即快捷方式
                -u 目标文件比 源文件旧,则替换为新文件
                -f 强制复制,不提示覆盖
                -i 如果目标文件存在,则提示
        mv 移动文件,同时可以重命名文件
                -f 强制移动,不提示
                -i 如果目标文件已存在,则提醒是否覆盖
                -u 如果目标已存在,源文件更新才更新(update)
        rm 删除文件
                -f 强制删除,不提示
                -i 删除前,提醒用户确认
                -r 递归删除,用于目录的删除
        basename 获取文件名 basename /etc/sysconfig/network.cig 结果为network.cig
        dirname 获取路径名 dirname /etc/sysconfig/network 的结果是/etc/sysconfig

        --------------------------------------------------------------------------------
        cat 查看文件内容,从起始显示
                -n 显示行号
        tac 查看文件,从结尾开始
                nl 显示时,输出行号
        more 一页一页显示
        less 一页一页显示,可以向前翻页
                具有与 man 命令显示内容类似的查找等功能
        head 只看前几行
        tail 只看后几行
                -n 两个命令同样的参数,表示显示几行 tail -n 10 尾部十行
        od 以二进制形式读取文件内容

        touch 创建一个文件,或用于修改创建时间等。

        umask 显示文件默认创建的权限
                -S 以符号形式给出默认权限的值

        chattr 修改隐藏属性
                lsattr 显示隐藏属性

        file 显示文件的类型
        ------------------------------------------------------------------------------
        which 搜索文件。这个命令根据 PATH 路径来搜索 执行文件 的文件名
                -a 将所有可找到的命令都列举出来

        whereis 寻找特定文件
                -b 只找二进制文件
                -s 只找源文件
                -m 只在帮助目录下找文件

        locate 寻找特定文件,与whereis都是从特定文件数据库中查找

        find 搜寻文件,它搜寻磁盘,非常耗费时间
                find [PATH] [option] [action]
                [PATH] 指定了要搜索的目录,如果为 / 则是从root目录,根目录搜索所有的文件
                -atime n n 为数字,含义是n天之前,一天之内访问access过的文件
                -ctime n n 为数字,n天之前,一天之内修改(change)过状态的文件
                -mtime n n 为数字,n天之前,一天之内修改(modification)过的文件
                -newer file file为一个存在的文件,意思是比file更新的文件

                -uid n n为数字,用户帐号ID,UID
                -gid n n为GID,即特定GID的文件
                -user name name为用户名,即特定用户的文件
                -group name name为组名称,特定组的文件
                -nouser 文件的拥有者不在 /etc/passwd中的文件
                -nogroup 拥有的用户组不再 /etc/group中的文件

                -name filename 搜索文件名为filename 的文件
                -size [+-] SIZE 搜索比SIZE还要大(+)或小(-)的文件。SIZE规格 c为byte k为 1024bytes -size+50k 即大小大于50k的文件
                -type TYPE 搜索文件的类型为TYPE,正规文件 f,设备文件b,c 目录 d,链接文件 l,套接字 s,FIFO(p)等属性
                -perm mode 搜索文件属性刚好等于mode的文件
                -perm -mode 文件属性全部包含 mode的属性
                -perm +mode 搜索文件属性包含任一mode属性的文件 

                -exec command command为命令,可以将搜索到的结果直接调用command处理
                -print 默认的动作,即搜索到就会打印出来

        -------------------------------------------------------------------------------------------------------
        目录文件压缩
                *.Z compress程序压缩的文件
                *.bz2 bzip2程序压缩的文件
                *.gz gzip程序压缩文件
                *.tar tar程序打包的数据,没有压缩过
                *.tar.gz tar程序打包,经过gzip压缩

        compress [-dcr] 文件或目录
                -d 用来解压缩的参数
                -r 联通目录下的文件同时压缩
                -c 将压缩数据输出为标准输出

        uncompress 也可以解压缩 *.Z的文件
        gzip  [-cdt#] 文件名
        zcat  文件名.gz
                -c 将压缩的数据输出到屏幕,通过重定向可以导向处理
                -d 解压缩参数
                -t 校验一个压缩文件的一致性
                # 压缩登记,-1 最快,压缩比最小,-9最慢,压缩最小

        bzip2 [-cdx] 文件名
        bzcat 文件名.bz2
                -c 将压缩产生数据输出到屏幕上
                -d 解压缩的参数
                -z 压缩的参数
                -# 与gzip相同,压缩比例参数

        tar [-cxtzjvfpPN] 文件 与 目录
                -c 建立压缩文件参数
                -x 见压缩文件的参数命令
                -t 查看tarfile的文件,c / x / t 只能有一个存在
                -z 是否使用gzip压缩
                -j 是否使用bzip2压缩
                -v 压缩过程中显示文件
                -f 使用文件名,
                -p 使用原文件的原来属性
                -P 使用绝对路径来压缩
                -N 要新的文件才会被打包

        dd if="input_file" of="output_file" bs="block_size" count="number"
                这个命令可以将输入文件复制到输出文件,可以用于备份文件等。

vim 与 vi
        移动光标的方法  h 向左移动  l 向右移动  j 向下移动光标  k 向上移动光标
        + -  移动到非空格符的下一行 或 上一行
        0 移动到当前行的行首字符, $ 移动到当前行的末尾字符
        H 移动到屏幕的最上方一行,M 移动到屏幕的中间一行  L 移动到屏幕的最下方一行
        G 移动到文件的最后一行    nG 移动到文件的第n行
        gg 移动到文件的第一行,与 1G相同
        n Enter 向下移动n行

        /word 从光标处向后搜索 word字符串
        ?word 从光标处向上搜索word字符串

        n / N 重复前一个搜索的动作,重复"反向"进行的前一个搜索命令

        :n1、n2s/word1/word2/g 在n1与n2行之间搜索word1字符串,并将它替换为word2

        x,X 在一行中x向后删除一个字符,X为向前删除一个字符
        nx n为数字,向后删除n个字符

        dd 删除当前所在的行
        ndd 删除当前行及其之后 共n行内容
        d1G 删除光标所在位置到第一行的所有数据
        dG 删除光标所在行到最后一行的所有内容
        d$ 删除光标所在位置到该行的最后一个字符
        d0 删除光标所在位置到该行最开始的所有字符
        
        yy 复制光标所在一行
        nyy 复制光标及其之后的n行内容
        y1G 复制光标所在行到第一行的所有内容
        yG 复制光标所在行到最后一行的数据
        y0 复制光标所在位置到行行首的所有的数据
        y$ 复制光标所在的字符到行末尾的所有数据
        
        p,P p为将复制数据粘贴到光标下一行。P为粘在光标上一行
        J 将光标所在行与下一列的数据结合成一行
        c 重复删除多个数据,向下删除10行 10cj
        
        u 复原前一个操作
        Ctrl-r 重复上一个操作

vim 的特殊的功能
        块选择
                v 字符选择,会将光标经过地方反白选择
                V 行选择,会将光标经过的行反白选择
                Ctrl + v 块选择,可以用长方形的方式选择数据
                y 复制反白的地方
                d 将反白的地方删除掉

        多文件编辑
                :n 编辑下一个文件
                :N 编辑上一个文件
                :files 列举出当前vim打开的所有文件

        多窗口编辑
                :sp [filename] 打开一个新窗口。如果加filename,表示新窗口打开一个新文件,否则打开同一个文件
                Ctrl + wj 先按Ctrl不放,再按下w后,放开所有键,然后按下j,光标移动到下方窗口
                Ctrl + wk 同上,窗口移向上面窗口
                Ctrl + wl 同上,移向右边窗口
                Ctrl + wq 结束离开。可以将光标移动到一个窗口,然后":q"命令离开

环境设置:
        :set all 显示当前所有的环境参数设置值
        :set nu / nonu 设置行号或取消行号
        :set hlsearch 设置是否将搜索的字符反白
        :set autoindent 设置自动缩排,不自动缩排 :set noautoindent
        :set backup 设置是否自动存储备份文件
        :set ruler 是否在右下角显示状态行说明
        :set showmode 是否在左下角状态行显示 --Insert--

        :syntax(off|on) 根据程序相关语法显示不同的颜色

Dos与Linux的换行符
        Dos的换行符为 ^MS ,即CR LF,而Linux的换行为 LF
        通过简单命令将dos与Unix的换行符进行替换
        dos2unix [-kn] file [newfile]
        unix2dos [-kn] file [newfile]
                -k 保留该文件爱你原来的mtime时间个是
                -n 保留原来的旧文件,将转换后的文件输出到新的文件,dos2unix -n old new
        
Shell编程
        Bash的内置命令
                type [-tpa] name type显示出name是外部命令还是bash内置的命令
                file 表示为外部命令
                alias 表示为命令别名所设置名称
                builtin 表示为bash内置的命令功能

                -p 接name为命令,则显示完成文件名或显示为内置命令
                -a 在PATH变量定义的路径中,列举出所有含有name的命令,包括alias

        command [-options] parameter1 parameter2 ...
                1.一行命令第一个输入的绝对是命令或勀执行文件
                2.command 为命令名称
                3.中括号[]并不存在实际的命令中,表示可选内容。-为加入参数设置,完整参数名输入-- 
                4.parameter1 parameter2 ... 为跟在option后的参数,或command参数
                5.命令太长时,用"\"符号来分行,注意 "\"符号后必须跟着换行
                6.Unix中大小写敏感

        bash变量功能
                echo $variable / echoe ${variable} 输出变量内容

        变量定义:
                1.无类型定义
                2.变量与变量内容以"="链接,等号两边不能有空格
                3.变量名以英文字母和数字,但数字不能为起始字符
                4.变量内容如果有空格,需要用双引号",或单引号“'”将内容结合起来,双引号可以保持变量特性 
                5.必要时,用转义字符"\"将特殊字符变为一般字符(Enter,$,\,空格符号等)
                6.使用`command`在一串命令中放其他的命令。` 符号不是单引号,OK?
                7.若变量为扩展变量内容,需要以双引号以及"$变量名称"继续累加,如"$PATH":/home
                8.若变量需要在其他子程序执行,则需要用export是变量变为环境变量
                9.通常大写字母为系统默认变量,自行设置变量用小写字母。
                10.取消变量的方法为 "unset 变量名"
                例如:
                cd /lib/modules/`uname -r`/kernel 进入当前核心的模块目录,uname -r返回版本号

        几个重要的环境变量
        HOME 代表用户的家目录
        SHELL 当前使用的Shell程序
        HISTSIZE 历史命令的数量
        PATH 执行文件搜索的路径,以冒号 : 分割

        set 使得环境变量的设置只在当前shell环境下有效
        $ 当前Shell的PID   echo $$ 查看当前进程ID
        ? 上一个执行命令的回传码,echo $? 

        export name 将自定义变量转换为环境变量,这样可以在其他shell脚本引用

        read [-pt] variable 读取键盘输入的变量,与用户交互时使用
                -p 后面可以接提示符
                -t 后面可以接等待的"秒数"

                read -p "Please input string:" atest 将输入赋值给atest

        declare [-aixr] variable
                -a 将variable定义为数组
                -i 将variable定义为整数数字
                -x 将variable定义为环境变量,与export一样
                -r 将variable的变量设置为readonly

        var[index]="small min" 设置数组var的index元素为 small min字符串
                读取内容可以用 echo ${var[1]} 这种方式,确保无误

        alias 设置别名
                alias rm='rm -i' 将rm设置为 rm -i 命令的别名
        unalias rm 将设置的rm别名删除掉

        通配符与特殊符号:
                * 通配符,代表有0个或多个字符或数字
                ? 通配符,代表“一定有”一个字母
                # 注释
                \ 转移字符
                | 管道分隔符
                ; 继续命令执行
                ~ 用户的家目录
                $ 变量之前,需要加的变量替换值
                & 将命令变为后台执行
                ! 逻辑运算中的“非”
                / 路径分割的符号
                >,>> 输出导向,即重定向,替换与累加
                ' 不具有变量置换的功能
                " 变量置换的功能,即$PATH会被置换成变量内容
                `` 可以先执行的命令
                () 中间为zishell的起始与结束
                [] 中间为字符的组合
                {} 中间为命令区块组合
                Ctrl+C 终止当前命令
                Ctrl+D 输入结束
                Ctrl+M 就是Enter键
                Ctrl+S 暂停屏幕的输出
                Ctrl+Q 恢复屏幕的输出
                Ctrl+U 提示符下,删除整行命令
                Ctrl+Z 暂停当前命令

        例子:
                ls -lda /etc/[!a-z] 找不想有小写字母开头的文件
                ls -lda /etc/*[0-9]* 找文件名中有数字的文件名
                        []仅表示一个数字,这个数字可以在 0-9之间选择
                ls test* 表示以 test开头的文件名
                ls test? 以test开头,且后面一定有一个未知字符的文件名
                ls test??   必须有三个未知字符的文件名

                ls > ~/abc 将ls的结果导向到 ~/abc文件中,如果abc存在直接替换文件内容
                0 1 2 分别表示 标准输入,标准输出,标准错误
                ls / 2> abc.txt 将错误输出到abc.txt文件

cut 和 grep命令
        cut -d '分隔符' -f fields  将内容按照 分隔符分割,取出 第fields块内容
        cut -c 字符范围
                -d 后面接分隔符,与-f一起使用
                -f 歌曲-d分隔符将一段消息分为数段,-f标识取第几段
                -c 以字符为单位去除固定的字符范围                

        echo $PATH | cut -d ':' -f 5 以 : 将PATH分割,取出第五块

        用它来分析log比较合适,固定格式

        grep分析一行消息,其中有所需信息,将该行去除
        grep [-acinv] '搜索字符串' filename
                -a 将二进制文件以文本方式搜索
                -c 计算找到 目标字符串的次数
                -i 忽略大小写的不同
                -n 顺便输出行号
                -v 反向选择,即显示没有目标字符串的行

        排序命令 sort wc uniq
                sort [-fbMnrtuk] [file or stdin]
                        -f 忽略大小写差异
                        -b 忽略最前面的空格符部分
                        -M 以月份的名字来排序
                        -n 使用 纯数字 进行排序
                        -r 反向排序
                        -u 就是uniq
                        -t 分隔符默认是tab
                        -k 按照那个字段进行排序

        cat /etc/passwd | sort 以第一个数据,以文字类型排序

        uniq [-ic]
                -i 忽略大消息
                -c 进行计数
                可以将该命令跟在 cut之后,统计重复的数量

        wc [-lwm] 
                -l 显示多少行
                -w 显示多少字
                -m 显示多少字符

        tee 双向定位,即重定向到标准输入输出,也定向到文件
                tee [-a] file 
                -a 以append 方式加入file文件

        字符转换
                tr,col,join,paste,expand
                tr [-ds] SET1
                        -d 删除消息中的SET1字符串
                        -s 替换重复的字符
                        last | tr '[a-z]' '[A-Z]' 将消息中的所有小写变为大写

                col [-x]
                        -x 将tab键转换成对等的空格键

                join [-ti12] file1 file2
                        将两个文件中具有相同数据的行链接到一起
                        -t 分隔符
                        -i 忽略大小写差异
                        -1 第一个文件用那个字段分析
                        -2 第二个文件用那个字段分析

                paste [-d] file1 file2 直接将两个文件拼接到一起

                expand [-t] file 将tab键替换为空格键,
                        -t 后面接数字,表示将一个tab键转换为几个 空格键

正则表达式
        grep选取字符串
        grep [-acinv] '搜索字符串' filename
                -a 二进制文件中以文本方式搜索数据
                -c 计算找到‘搜索字符串’的次数
                -i 忽略大小写
                -n 输出行号
                -v 反向选择,即显示没有'搜索字符串'内容的一行
                
        正则表达式特殊字符:
                ^word 待搜索的字符串在行首,grep -n '^#' regular.txt搜索行首为#开始的一行
                word$ 带搜索的字符串在行尾
                . 任意一个字符,一定是一个任意字符
                \ 转义字符,去除特殊符号的特殊意义
                * 重复0个或多个前一个字符
                \{n,m\} 连续n到m个"前一个重复字符",
                \{n\} 连续重复n个前一个字符
                \{n,\} 连续重复n个以上前一个字符
                
                [] 字符集合的重复特殊字符,即选择其中一个可以使用连字符 - 来表示可选字符的范围,例如[a-z]从字符a到字符z随意选一个使用^来表示反义,即不选其中的字符

        注意:正则的特殊符号与通配符的特殊符号不是一个意思 
                * 在正则表示重复0个或多个前一个字符,而在通配符则表示0个或多个字符
                ! ^  [!range]用于表示通配符的不包含,而正则的不包含用[^range]表示

        扩展正则特殊字符
                + 重复‘一个或一个以上’字符 egrep -n 'go+d' regular.txt 
                ? '0个或一个'字符
                | 用或的方式找出数个字符串 egrep -n 'gd|good' regular.txt 包含gd 或good
                () 找出'用户组'字符串,egrep -n 'g(la|oo)d' regular.txt

        使用正则表达式的两个工具:
                sed 主要用于整行文本的处理,可以添加删除文本
                awk 主要是处理"每一行字段内的数据",默认的字段分隔符为空格或tab键

        文件比较:
                diff 比较两个文件不同,用于行对比。用于在ASCII纯文本文件的比较
                cmp 比较两个文件,主要用"位"为单位比较
                patch 用于文件的升级

        Shell脚本
                Shell脚本是纯文本文件,将shell语法与命令写在里面,与正则表达式,管道与数据流重导向一起实现目的

                编写Shell脚本的良好习惯,在每个脚本的文件头处记录好
                        1. 脚本的功能
                        2. 脚本的版本信息
                        3. 脚本的作者与联系方式
                        3. 脚本的版权声明方式
                        4. 脚本的历史记录
                        5. 脚本内较忒数的命令,使用绝对路径的方式来执行
                        6. 预先声明与设置脚本运行时所需的环境变量

                test检测系统上某些文件或相关属性
                test -e /dmtsai && echo "exist" || echo "No exist" 判断文件是否存在

                test [-efdbcSpL] filename   

                文件类型检测

                        -e 该"文件名"是否存在
                        -f 该"文件名"是否为文件
                        -d 该"文件名"是否为目录
                        -b 该“文件名”是否为一个块设备
                        -c 该“文件名”是否为一个字符设备
                        -S 该“文件名”是否为一个套接字
                        -p 该“文件名”是否是一个FIFO文件
                        -L 该“文件名”是否为一个链接文件
                文件权限检测
                        -r 文件可读
                        -w 文件可写
                        -x 文件可执行
                        -u 文件是否具有SUID属性
                        -g 文件是否具有SGID属性
                        -k 文件是否Sticky bit属性
                        -s 文件是否非空白文件
                比较两个文件
                        -nt 一个文件比另一个新  test file1 -nt file2
                        -ot 一个文件比另一个文件旧
                        -ef 判断是否同一文件,用于判断硬链接
                两个整数之间判断
                        -eq 两数值相等
                        -ne 两数值不等
                        -gt n1大于n2
                        -lt n1小于n2
                        -ge n1大于等于n2
                        -le n1小于等于n2
                字符串判断
                        test -z string 判断字符串是否为空
                        test -n string判断字符串是否非空
                        test str1 = str2 判断str1 是否等于str2
                        test str1 != str2 判断str1是否等于str2

                多重条件判断
                        -a 用于多重条件判断 放在两个条件之间
                                test -r file -a -x file 同时具有可读可执行
                        -o 两个条件成立一个                        
                        ! 条件求反 test ! -x file 即file不具备x时,为true
                注:与test等同的就是 [] 条件判断运算符
                        使用[]时注意空格 [ "$HOME" == "$MAIL" ]
        Shell脚本的默认变量
                /etc/init.d/crond restart
                /path/scriptname opt1 opt2 opt3  ...
                                   $0          $1   $2   $3   ...

        if..then语句
                使用test 或 [] 判断,可以在其中添加 &&(AND) 或 ||(OR)
                if [ 条件判断 ]; then
                elif [ 条件二 ]; then
                else

                fi


                case ... esac语句
                case $变量名称1 in
                        "第一个变量")
                                程序段
                                ;;
                        "第二个变量")
                                程序段
                                ;;
                        *)
                                不包含在上述case的条件
                                exit 1
                        ;;
                esac

        使用函数
                function fname(){
                        程序段
                }
                函数参数和shell脚本类似,也是使用 $1 $2 $3 ... 依次标记参数
                例如:
                function printit(){
                        echo -n "Your choice is $1"

                }


                echo "This program will print your selection!"
                case $1 in
                        "one")
                                printit 1
                                ;;
                        "two")
                                printit 2
                                ;;
                        *)
                                echo "Usage (one|two)"
                                ;;
                        esac

        循环语句
                while [ condition ]
                do
                        程序段落
                done

                until [ condition ]
                do
                        程序段落
                done

        /////////////////////////////////////////
        for (( 初始值; 限制值; 执行步长 ))
        do
                程序段
        done

        s = 0
        for (( i=1; i<=100; i++ ))
        do
                s=$(($s+$i))
        done

        ////////////////////////////////////////
        for var in con1 con2 con3
        do
                程序段
        done


        Shell脚本的追踪调试
                sh [-nvx] script.sh
                        -n 不要执行脚本,仅检查语法问题
                        -v 执行脚本前,将脚本的内容输出到屏幕
                        -x 将使用的脚本内容显示到屏幕上,很有用的参数

你可能感兴趣的:(Linux基础 笔记(鸟哥私房菜第二版))