zoukankan      html  css  js  c++  java
  • Linux常用命令1

    查看硬盘使用情况  df -hl
    查看目录使用情况  du -h
    查看占用的端口  netstat -ntlp
    查看当前目录占用大小:du -sh --max-depth=0 
    重命名命令: alias lm='ls -al' #将ls -al 命令重命名为lm,就可以直接使用了,使用alias可以查看当前已经重命名的命令
    设置变量 name=VARaa #等号左右不能有空格 
    删除变量 unset 变量名( unset name)
    查看当前环境变量设置情况: env
    

    问号变量的作用

    『上一个执行的指令所回传的值』
    0 表示该指令执行正常 其他表示错误

    $?变量只能查看上一条命令的执行结果。

    root@SC-201805061314:~# echo $PATH
    /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games
    #可以看到返回 0 说明上一条指令执行没有错误
    root@SC-201805061314:~# echo $?
    0
    #当前位置输出的127号,表示上条命令有错误
    12dasd=qqq
    12dasd=qqq: command not found
    root@SC-201805061314:~# echo $?
    127
    
    

    查看历史命令(history)

    alias h='history' # 将该命令重命名为 h
    h 10 # 显示最近10条
    h -c #将当前shell中的历史命令全部请吃
    h -a #将目前新增的命令添加至 histfiles文件中 默认该文件的位置在~/.bash_history
    echo $HISTSIZE 查看history中可以存储的命令条数
    
    历史命令仅限于查看历史执行的命令吗?当然不是
    !66  #执行第66条历史命令
    !!   #执行上一条命令(相当于 按下 ↑ + enter)
    !al  #执行历史命令中最近的以 al 开头的命令
    

    在用户登录系统后显示一些提示信息

    vim /etc/motd #在该文件写入的内容会在所有用户登录时,进行展示!
    

    读取用户输入的 [read]

    要读取来自键盘输入的变量,就是用 read 这个指令了。这个指令最常被用在 shell script 的撰写当中,
    想要跟使用者对谈?用这个指令就对了。

    [root@www ~]# read [-pt] variable
    选项与参数:
    -p :后面可以接提示字符!
    -t :后面可以接等待的『秒数!』这个比较有趣~不会一直等待使用者啦!
    范例一:让用户由键盘输入一内容,将该内容变成名为 atest 的变量
    [root@www ~]# read atest
    This is a test <==此时光标会等待你输入!请输入左侧文字看看
    [root@www ~]# echo $atest
    This is a test <==你刚刚输入的数据已经变成一个变量内容!
    范例二:提示使用者 30 秒内输入自己的大名,将该输入字符串作为名为 named
    的变量内容
    [root@www ~]# read -p "Please keyin your name: " -t 30 named
    Please keyin your name: VBird Tsai <==注意看,会有提示字符喔!
    [root@www ~]# echo $named
    VBird Tsai <==输入的数据又变成一个变量的内容了!
    

    将脚本添加到~/bin目录中,可以直接执行

    mkdir ~/bin
    因为在系统启动后,会首先加载etcprofile(全局配置文件)文件,profile文件中加载了
    ~/.bash_profile(个人配置文件),而在~/.bash_profile这个人文件中将 ~/bin 这个目录写入了全局环境变量,
    所以可以直接引用该目录下的所有可执行文件,而不需要写相对或绝对路径
    

    数据流重定向

    使用 > 表示覆盖重定向,会将文件中的历史数据覆盖。使用>>会追加到该文件中,不会覆盖.

    现在有如下需求
    登录普通用户,向要在 /home下查找 是否存在 .bashrc的文件,
    find /home -name .bashrc 由于使用普通用户登录执行该命令,但在/home中还有其他用户家目录,是不允许访问的,所以会出现错误。
    那么如果将正确的结果输入到一个文件,将报错信息出入到一个文件。
    
    1> :以覆盖的方式将正确的数据输出到指定文件或设备上。
    1>> :以追加的方式将正确的数据输出到指定文件或设备上。
    2> :以覆盖的方式将错误的数据输出到指定文件或设备上。
    2>> :以追加的方式将错误的数据输出到指定文件或设备上。
    
    find /home -name .bashrc > list_right 2> list_error
    
    这样 正确的信息会输出到 list_right 文件中
         错误信息会输出到 list_error 文件中
    

    /dev/null 垃圾桶黑洞设备

    想象一下,如果我们知道错误信息会发生,所以要将错误信息忽略掉而不显示或不存储 这个时候 /dev/null 就很重要了。这个/dev/null 可以吃掉任何导向这个设备的信息。

    # 下面的命令将错误信息丢弃,正确信息写到屏幕上
    find /home -name .bashrc 2> /dev/null
    

    通过cat命令向文件输入内容

    cat > catfile #这里可以通过cat命令向文件中输入内容 在输入结束后按 ctrl+c结束输入。
    
    #使用 cat命令 将其它文件内容输入到 catfile 中
     cat > catfile < ./ssr.sh #将ssr.sh文件中的内容输出到catfile中
    
    # 使用 << 结束 cat 输入
    #例如,我要用cat直接将输入的信息输出到catfile,且当键盘输入 eof时,该次输入结束。
    
    [root@iz2zedroc0yv90u3zvx212z ~]# cat > catfile << "eof"
    dasdasds
    dsadasdas
    hahahaha
    asdasdasd
    eof
    

    连续执行命令

    通常我们在执行命令时,想一行执行多个命令,有什么办法可以呢?

    # 一次执行多个命令,且命令时顺序执行的 
    例:在关机之前先执行两次 sync 同步
    sync; sync; shutdown -h now
    
    #当两个命令存在相依性的时候,$$ 与 || 就派上用场了。
    $$,|| 都是根据前一个命令的回传码进而决定后续命令是否执行
    #回传码是一个命令在执行之后,会回传一个状态码用于表示该命令是否执行成功 可使用 echo $?查看回传码,一般 回传码为0表示命令执行正确
    
    命令执行情况 说明
    cmd1 && cmd2 若cmd1执行完毕且正确($?=0),则开始执行 cod2 若cmd1执行完毕且执行错误($?≠0),则cmd2不执行
    cmd1 || cmd2 若cmd1执行完毕且正确($?=0),则不执行 cod2 若cmd1执行完毕且执行错误($?≠0),则cmd2开始执行
    -------------------------------------------------------------
    #使用ls查看/etc/qqq目录是否存在,不存在则不创建 aaa.txt文件,存在则创建。
    ls /etc/qqq && touch aaa.txt
    ------------------------------------------------------------
    #测试 /etc/qqq目录是否存在,不存在则创建,存在则不做事
    ls /etc/qqq || mkdir /etc/qqq
    -------------------------------------------------------------
    #如果想创建/tmp/abc/hehe.txt 这个文件,但我们并不知道该目录是否存在,应该怎操作?
    ls /tmp/abc/ || mkdir /tmp/abc && touch /tmp/abc/haha.txt
    
    【分析】
    这样无论如何hehe.txt这个文件都会被创建,为什么呢?
    因为linux中命令总是从左向右执行,所以
     - 若/tmp/abc 不存在,则$?≠0,因为 || 遇到了错误所以开始执行 mkdir /tmp/abc 由于该命令会执行成功,所以$=0,又因为&&遇到了成功所以开始执行touch /tmp/abc/haha.txt,最终文件创建
     
     - 若/tmp/abc 存在,则$?=0,因为 || 遇到正确所以后面的mkdir /tmp/abc不会执行,此时,将$?=0继续向后传递,所以 $$ 遇到成功则会执行 touch /tmp/abc/haha.txt 最终文件创建
     -----------------------------------------------------------
     #测试 /tmp/vbirding 是否存在,若存在则输出 exist 不存在输出 not exist
     
     ls /tmp/vbirding && echo 'exist' || echo 'not exist'
    ls: cannot access /tmp/vbirding: No such file or directory
    not exist
    

    管道

    管道命令使用 | 符号,管道命令与“连续执行命令”是不同的。

    在管道后面必须是一个能够接受 standard input的数据才行,这样的名称才称为管道命令,例如 less,more,head,tail等,至于 ls,cp,mv就不是管道命令了。

    • 主要事项
    • 管道命令只会处理 standard output,对于 standard error output会忽略
    • 管道命令必须奥能够接受来自前一个命令的数据为 standard input才能继续处理。

    cut命令

    这个命令可以将一段信息某段“切出”,处理的信息是以行为单位的

    cut 主要是用于在一行中取出我们想要的部分信息

    用法:
     cut -d'分割符' -f '字段'   #用于分割字符
     cut -c '字符范围' #用于排列整齐的信息
     
     #将PATH变量取出,找到第五个路径
     [root@iz2zedroc0yv90u3zvx212z tmp]# echo $PATH
    /export/servers/jdk1.8.0_141/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/alidata/server/mysql/bin:/alidata/server/nginx/sbin:/alidata/server/php/sbin:/alidata/server/php/bin:/root/bin
    
    [root@iz2zedroc0yv90u3zvx212z tmp]# echo $PATH |cut -d ':' -f 5
    /usr/bin
    
    #取出第三个和第五个
    echo $PATH |cut -d ':' -f 3,5
    
    #将 export 输出的信息取得第12个字符以后的所有字符串
    [root@iz2zedroc0yv90u3zvx212z tmp]# export
    declare -x HISTCONTROL="ignoredups"
    declare -x HISTSIZE="1000"
    declare -x HOME="/root"
    declare -x HOSTNAME="iz2zedroc0yv90u3zvx212z"
    declare -x JAVA_HOME="/export/servers/jdk1.8.0_141"
    declare -x LANG="en_US.UTF-8"
    。。。
    
    [root@iz2zedroc0yv90u3zvx212z tmp]# export | cut -c 12-
    HISTCONTROL="ignoredups"
    HISTSIZE="1000"
    HOME="/root"
    HOSTNAME="iz2zedroc0yv90u3zvx212z"
    JAVA_HOME="/export/servers/jdk1.8.0_141"
    LANG="en_US.UTF-8"
    。。。
    #也可以指定范围 
    export | cut -c 12-20
    

    grep

    grep 是分析一行信息,若当中有我们需要的信息就将该行拿出来

    语法
     grep [-acinv] [--color=auto] '查找字符串' filename
     -a 将binary文件以text文件的方式查找数据
     -c 计算找到 ‘查找字符串’ 的次数
     -i 忽略大小写,大小写视为相同
     -n 输出行号
     -v 反向选择,即显示没有 '查找字符串'内容的行
     --color=auto 可以将显示的字符串按指定颜色显示
     
     # last 当中有出现 root的就取出
     last |grep 'root'
     
     #last 中没没有出现root的显示
     last |grep -v 'root'
    
    • 高级用法

    搜索字符串 加行号

    grep -n 'the' regular_express.txt
    

    反向选择

    比如如下命令,当该行没有 'the' 这个字符串时才显示在屏幕上

     grep -vn 'the' regular_express.txt
    

    忽略大小写

    grep -in 'the' regular_express.txt
    

    使用[]搜索

    #表示搜索包含 tast test 的行,[]中无论都几个字符,都只代表一个
    即 t?st
     grep -n t[ae]st regular_express.txt
    

    搜寻 包含oo 的行

    [root@www ~]# grep -n 'oo' regular_express.txt
    1:"Open Source" is a good mechanism to develop programs.
    2:apple is my favorite food.
    3:Football game is not use feet only.
    9:Oh! The soup taste good.
    18:google is the best tools for search keyword.
    19:goooooogle yes!
    

    搜寻 在 oo 前面不包含g的行

    [root@www ~]# grep -n '[^g]oo' regular_express.txt
    2:apple is my favorite food.
    3:Football game is not use feet only.
    18:google is the best tools for search keyword.
    19:goooooogle yes!
    # 第2,3行没有异议,18 行虽然有不符合条件的,但是后面有too是符合条件的,所以是符合的
    

    搜寻 oo前没有小写字母的

    grep -n '[^a-z]oo' regular_express.txt
    #也可以这样操作
    [root@www ~]# grep -n '[^[:lower:]]oo' regular_express.txt
    # 那个 [:lower:] 代表的就是 a-z 的意思。
    

    行首与行尾字符 ^ $

    我们在例题一当中,可以查询到一行字符串里面有 the 的,那如果我想要让 the 只在行首列出呢? 这
    个时候就得要使用制表符了!我们可以这样做:

    [root@www ~]# grep -n '^the' regular_express.txt
    12:the symbol '*' is represented as start.
    
    #开头是小写字符
    grep -n '^[a-z]' regular_express.txt
    
    #不想要开头是英文字母
    grep -n '^[^a-zA-Z]' regular_express.txt
    

    注意到了吧?那个 ^ 符号,在字符集合符号(括号[])之内与之外是不同的! 在 [] 内代表『反向选择』,
    在 [] 之外则代表定位在行首的意义!

    行尾
    #找出行尾是小数点结束的 
    #因为小数点具有其他意义,所以必须要使用跳脱字符()来加以解除其特殊意
    义!
    grep -n '.$' regular_express.txt
    
    #如果我想要找出来,哪一行是『空白行』, 也就是说,该行并没有
    #输入任何数据,该如何搜寻?
    grep -n '^$' regular_express.txt
    #因为只有行首跟行尾 (^$),所以,这样就可以找出空白行
    
    去掉空白行与注释(#号开头的行)
    grep -v '^$' /etc/syslog.conf | grep -v '^#'
    # 其中第一个『 -v '^$' 』代表『不要空白行』,
    # 第二个『 -v '^#' 』代表『不要开头是 # 的那行』喔!
    
    

    通配

    . (小数点):代表『一定有一个任意字符』的意思;

    • (星星号):代表『重复前一个 0 到无穷多次』的意思,为组合形态
    #假设我需要找出 g??d 的字符串,亦即共有四个字符, 起头是 g
    而结束是 d ,我可以这样做
    
    grep -n 'g..d' regular_express.txt
    
    
    #如果我需要找出【至少2个o以上的字符串】就需要ooo*了,因为*表示前面的一个可以有0个或多个o
     grep -n 'ooo*' regular_express.txt
     
     我想要字符串开头与结尾都是 g,但是两个 g 之间
    仅能存在至少一个 o ,亦即是 gog, goog, gooog.... 等等,那该如何?
     grep -n 'goo*g' regular_express.txt
     
     如果我想要找出 g 开头与 g 结尾的字符串,当中的字符可有可无,那该如何
    是好?
    
    grep -n 'g.*g' regular_express.txt
    #说明:.代表任意 *代表0或多个 所以中间就是任意字符的任意个
    
    如果我想要找出『任意数字』的行列呢?因为仅有数字,所以就成为
    grep -n '[0-9][0-9]*' regular_express.txt
    
    范围限定{}

    如果我想要限制
    一个范围区间内的重复字符数呢?举例来说,我想要找出两个到五个 o 的连续字符串,该如何作?这时
    候就得要使用到限定范围的字符 {} 了。 但因为 { 与 } 的符号在 shell 是有特殊意义的,因此, 我们必须
    要使用跳脱字符 来让他失去特殊意义才行。

    #假设我要找到两个 o 的字符串,可以是:
    grep -n 'o{2}' regular_express.txt
    
    #假设我们要找出 g 后面接 2 到 5 个 o ,然后再接一个 g 的字符串,他会是这样
    grep -n 'go{2,5}g' regular_express.txt
    
    #如果我想要的是 2 个 o 以上的 goooo....g 呢?除了可以是 gooo*g ,也可以是:
    
    grep -n 'go{2,}g' regular_express.txt
    
    

    *注意:『正规表示法的特殊字符』与一般在指令列输入指令的『通配符』并不相同, 例如,在通配
    符当中的 * 代表的是『 0 ~ 无限多个字符』的意思,但是在正规表示法当中, * 则是『重复 0 到无穷
    多个的前一个 RE 字符』的意思~使用的意义并不相同,不要搞混了!
    举例来说,不支持正规表示法的 ls 这个工具中,若我们使用 『ls -l * 』 代表的是任意档名的档案,而
    『ls -l a
    』代表的是以 a 为开头的任何档名的档案, 但在正规表示法中,我们要找到含有以 a 为开头
    的档案,则必须要这样:(需搭配支持正规表示法的工具)
    ls | grep -n '^a.*' **

    例题
    找出 /etc 下的连接类型文件
    ls -l |grep '^l'
    
    找出 /etc 下非连接文件(链接文件以 l开头)
    ls -l |grep '^[^l]'
    # 说明 ^在[]外边表示字符串开头,在[]里面表示 非
    
    找出 /etc 下链接类型文件的总数
    ls -l /etc/ | grep '^l' | wc -l
    

    sed 工具

    sed 本身也是一个管线命令,可以分析 standard input 的啦! 而且 sed
    还可以将数据进行取代、删除、新增、撷取特定行等等的功能

    [root@www ~]# sed [-nefr] [动作]
    选项与参数:
    -n :使用安静(silent)模式。在一般 sed 的用法中,所有来自 STDIN
     的数据一般都会被列出到屏幕上。但如果加上 -n 参数后,则只有经过
     sed 特殊处理的那一行(或者动作)才会被列出来。
    -e :直接在指令列模式上进行 sed 的动作编辑;
    -f :直接将 sed 的动作写在一个档案内, -f filename 则可以执行 filename 内
    的
     sed 动作;
    -r :sed 的动作支持的是延伸型正规表示法的语法。(预设是基础正规表示法语
    法)
    -i :直接修改读取的档案内容,而不是由屏幕输出。
    动作说明: [n1[,n2]]function
    n1, n2 :不见得会存在,一般代表『选择进行动作的行数』,举例来说,如果我
    的动作
     是需要在 10 到 20 行之间进行的,则『 10,20[动作行为] 』
    function 有底下这些咚咚:
    a :新增, a 的后面可以接字符串,而这些字符串会在新的一行出现(目前的下
    一行)~
    c :取代, c 的后面可以接字符串,这些字符串可以取代 n1,n2 之间的行!
    d :删除,因为是删除啊,所以 d 后面通常不接任何咚咚;
    i :插入, i 的后面可以接字符串,而这些字符串会在新的一行出现(目前的上一
    行);
    p :打印,亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运作~
    s :取代,可以直接进行取代的工作哩!通常这个 s 的动作可以搭配
     正规表示法!例如 1,20s/old/new/g 就是啦!
    
    • 实例
    # 将 /etc/passwd 的内容列出并且打印行号,同时,请将第 2~5 行删除!
    nl /etc/passwd | sed '2,5d'
    

    注意的是,
    sed 后面接的动作,请务必以 '' 两个单引号括住

    # 只要删除第 2 行
    nl /etc/passwd | sed '2d'
    
    # 若是要删除第 3 到最后一行
    nl /etc/passwd | sed '3,$d'  #『 $ 』代表最后一行!
    
    # 在第二行后(亦即是加在第三行)加上『drink tea』字样!
     nl /etc/passwd | sed '2a drink tea'
     
     #在第二行前面加上『drink tea』字样!
     nl /etc/passwd |sed '2i Drink tea'
     
     # 如果是要增将两行以上呢?
     [root@iz2zedroc0yv90u3zvx212z ~]# nl /etc/passwd |sed '2a Drink tea or ...
    > drink beer?'
         1  root:x:0:0:root:/root:/bin/bash
         2  bin:x:1:1:bin:/bin:/sbin/nologin
    Drink tea or ...
    drink beer?
         3  daemon:x:2:2:daemon:/sbin:/sbin/nologin
         4  adm:x:3:4:adm:/var/adm:/sbin/nologin
    # 第一后面必须加  单引号不要闭合
    
    #插入4行
    nl /etc/passwd |sed '2a aaa
    > bbb
    > cccc
    > ddd'
    
    
    • 取代操作

    c :取代, c 的后面可以接字符串,这些字符串可以取代 n1,n2 之间的行!

    将第 2-5 行的内容取代成为『No 2-5 number』呢?
     nl /etc/passwd |sed '2,5c No 2-5 number'
     
     仅列出 /etc/passwd 档案内的第 5-7 行
     nl /etc/passwd | sed -n '5,7p'
     #sed 后面需要加-n 不加-n会重复5-7行数据,达不到预期
    
    • 部分数据的搜寻并取代的功能

    除了整行的处理模式之外, sed 还可以用行为单位进行部分数据的搜寻并取代的功能喔! 基本上 sed
    的搜寻与取代的与 vi 相当的类似!

    sed 's/要被取代的字符串/新的字符串/g'
    

    ip截取

    /sbin/ifconfig eth0 |grep 'inet'|sed 's/^.*inet //g' |sed 's/net.*$//g'
    
    #说明 grep 'inet' 先过滤出ip地址行
    inet 192.168.1.221  netmask 255.255.255.0  broadcast 192.168.1.255
    通过  sed 's/^.*inet //g'  配合正则表达式,去掉 ip前面的字符/ / /字符串替换
    
    通过sed 's/net.*$//g' 去掉ip后面的字符
    
    找到 带 MAN的行 去除注释行 去除空行
    cat /etc/man.config | grep 'MAN'| sed 's/#.*$//g' | 
    > sed '/^$/d'
    
    .结尾的换为!
     sed -i 's/.$/!/g' regular_express.txt
     # 上头的 -i 选项可以让你的 sed 直接去修改后面接的档案内容而不是由屏幕输出
    喔!
    
    利用 sed 直接在 regular_express.txt 最后一行加入『# This is a
    test』
    sed -i '$a # This is a test' regular_express.txt
    # 由于 $ 代表的是最后一行,而 a 的动作是新增,因此该档案最后新增啰!
    
    

    PAGE 434

    awk:好用的数据处理工具

    awk 也是一个非常棒的数据处理工具!相较于 sed 常常作用于一整个行的处理, awk 则比较倾向于一
    行当中分成数个『字段』来处理。因此,awk 相当的适合处理小型的数据数据处理呢!awk 通常运作的
    模式是这样的:

    awk '条件类型 1{动作 1} 条件类型 2{动作 2} ...' filename

    awk 后面接两个单引号并加上大括号 {} 来设定想要对数据进行的处理动作。

    在awk中每一个字段有一个固定变量表示 $1表示第一个字段 $2表示第二个字段依此类推.其中$0表示一整行

    • awk的处理流程
    1. 读入第一行,并将第一行的资料填入 $0, $1, $2.... 等变数当中;
    2. 依据 "条件类型" 的限制,判断是否需要进行后面的 "动作";
    3. 做完所有的动作与条件类型;
    4. 若还有后续的『行』的数据,则重复上面 1~3 的步骤,直到所有的数据都读完为止。
    

    实例

    若我想要取出账号与登入者的 IP ,且账号与 IP 之间以 [tab] 隔开,则会变成这样:

     last -n 5 | awk '{print $1 "	" $3}'
    
    • 内建变量
    变量名称 代表意义
    NF 每一行 ($0) 拥有的字段总数
    NR 目前 awk 所处理的是『第几行』数据
    FS 目前的分隔字符,默认是空格键
    • 实例2
    我们继续以上面 last -n 5 的例子来做说明,如果我想要:
    x 列出每一行的账号(就是 $1);
    x 列出目前处理的行数(就是 awk 内的 NR 变量)
    x 并且说明,该行有多少字段(就是 awk 内的 NF 变量)
    
     last -n 5| awk '{print $1 "	 lines: " NR "	 columes: " NF}'
     # 说明 NR NF等内建变量不需要前面加$, 要写在字符串外部。
    

    -实例3

    举例来说,在 /etc/passwd 当中是以冒号 ":" 来作为字段的分
    隔, 该档案中第一字段为账号,第三字段则是 UID。那假设我要查阅,第三栏小于 10 以下的数据,并
    且仅列出账号与第三栏, 那么可以这样做:
    
    cat /etc/passwd | awk '{FS=":"} $3 < 10 {print $1 "	" $3}'
    
    结果
    root:x:0:0:root:/root:/bin/bash
    bin     1
    daemon  2
    adm     3
    lp      4
    sync    5
    shutdown        6
    halt    7
    mail    8
    发现 除第一行有问题,其余的都改变了,为什么第一行没有变呢?
    这是因为我们读入第一行的时候,那些变数 $1,
    $2... 默认还是以空格键为分隔的,所以虽然我们定义了 FS=":" 了, 但是却仅能在第二行后才开始生效。
    
    # 那应该如何操作 可以使用 BEGIN
     cat /etc/passwd |awk 'BEGIN{FS=":"} $3 < 10 {print $1 "	" $3}'
    注意:BEGIN 要在{}外面哦!
    

    awk的计算功能

    如果要用 awk 来进行『计算功能』呢?以
    底下的例子来看, 假设我有一个薪资数据表档名为 pay.txt ,内容是这样的:

    Name 1st 2nd 3th
    VBird 23000 24000 25000
    DMTsai 21000 20000 23000
    Bird2 43000 42000 41000
    

    如何帮我计算每个人的总额呢?而且我还想要格式化输出喔!我们可以这样考虑:

    • 第一行只是说明,所以第一行不要进行加总 (NR==1 时处理);
    • 第二行以后就会有加总的情况出现 (NR>=2 以后处理)
     cat pay.txt|
    > awk 'NR==1 {printf "%10s %10s %10s %10s
    ",$1,$2,$3,$4,"Total"}
    > NR>=2{total = $2 + $3 + $4
    > printf "%10s %10d %10d %10d %10.2f
    ",$1,$2,$3,$4,total}'
    
    也可以是:
    cat pay.txt|awk 'NR==1 {printf "%10s %10s %10s %10s
    ",$1,$2,$3,$4,"Total"}NR>=2{total = $2 + $3 + $4;printf "%10s %10d %10d %10d %10.2f
    ",$1,$2,$3,$4,total}'
    
    以上两个不同之处在与在一个{}中若有多个语句,则需要用回车或者分号(;)隔开
    
    

    注意:
    逻辑运算当中,如果是『等于』的情况,则务必使用两个等号『==』!
    格式化输出时,在 printf 的格式设定当中,务必加上 ,才能进行分行!
    bash shell 的变量不同,在 awk 当中,变量可以直接使用,不需加上 $ 符号。

    排序命令

    sort

    sort [-fbMnrtuk] [file or stdin]
    参数
    -f 忽略大小写
    -b 忽略最前面的空格
    -M 以月份名字来排序,例如 JAN,DEC等排序方法
    -n 使用“纯数字”进行排序(默认字典排序)
    -r 反向排序
    -u 就是uniq 相同的数据只出现一次,去重
    -t 分隔符 ,默认[Tab]
    -k 以哪个区间进行排序
    
    #个人账号记录在 /etc/passwd 文件中,对个人账号进行排序
    cat /etc/passwd |sort
    
    # passwd内容是以 :进行分割的,向以第三列来排序,如何操作?
    cat /etc/passwd |sort -t ':' -k 3
    看到数字也是按照字典排序的,想用数字排序需要加 -n
     cat /etc/passwd |sort -t ':' -k 3 -n
     
    # 利用last只输出账号数据,并排序
    last |cut -d ' ' -f1 | sort
    

    uniq

    去重

    uniq [-ic]
    -i 忽略大小写
    -c 进行计数
    
    #使用last 将账号列出,仅取账号列,进行排序并去重
    last |cut -d ' ' -f1 | sort | uniq
    
    #如果还想知道登录次数,怎么操作?
    [root@iz2zedroc0yv90u3zvx212z etc]# last |cut -d ' ' -f1 |sort | uniq -c
          1
          2 reboot
         66 root
          1 wtmp
    
    

    wc

    如果想知道 /etc/man.config 这个文件里有多少字?多少行?多少字符的话,就可以使用wc完成

    wc [-lwm]
    -l 仅列出行
    -w 仅列出字(单词)
    -m 多少字符
    
    #查看 /etc/profile 中有多少 字,行,字符数
    [root@iz2zedroc0yv90u3zvx212z etc]# cat /etc/profile |wc
         89     271    2199
    # 输出的三个数字分别代表 行,字数,字符数
    
    #列出这个月份登陆系统的总人次
    last |grep [a-zA-Z] |grep -v 'wtmp' |wc -l
    #说明:由于last 中会显示空白行 ,所有使用 grep [a-zA-Z]去掉空白行,使用 grep -v 'wtmp' 去掉 wtmp 最后统计行数即可
    
    

    双向重定向 tee

    tee 命令可以将数据输出到文件 并 在命令行显示

    将ls的数据在homefile中存储并在屏幕打印数据

    ls -l /home |tee ~/homefile |more
    

    kettle 执行转换任务的脚本命令

     ./pan.sh -file ../kettle/json2txt.ktr -param:input=/export/servers/kettle/ -param:output=/export/servers/kettle/
    
    file ../kettle/json2txt.ktr   指定脚本名称
    -param:input=/export/servers/kettle/    指定输入路径
    -param:output=/export/servers/kettle/   指定输出路径
    

    kettle执行作业任务的脚本命令

    ../data-integration/kitchen.sh -file 服务器作业.kjb -param:input=/export/servers/kettle/  -param:output=/export/servers/kettle/
    
  • 相关阅读:
    小笔记——a标签触发file
    错误笔记——MVC自带验证
    错误笔记——表达式树不能包含动态操作(aspx)的解决
    囫囵吞枣——Bootstrap
    闪回技术
    RAC架构中各种日志所在路径
    行迁移与行链接
    BBED制作空块并用rman恢复(修改坏块前一定要做rman备份!!!)
    死锁处理
    更改一字段的全部字节的大小写
  • 原文地址:https://www.cnblogs.com/maguangyi/p/14215189.html
Copyright © 2011-2022 走看看