Category: Linux

  • awk使用方法

    awk算是一门很强大的语言,这里只有常用的一些命令

    awk 的特性

    • awk 能按行,列读取文件
    • 和其他语言一样,有变量,条件,循环
    • 有计算和字符串操作
    • 可以生成格式化的输出

    语法要注意

    awk '/search pattern1/ {Actions}
         /search pattern2/ {Actions}' file
    • search 可以是正则表达式
    • action 为要执行的动作
    • 程序中间要用单引号引起来

    匹配符

    ~ 匹配
    !~ 不匹配

    特殊变量
    NF 字段个数
    NR 记录个数(行数)
    FS filed separator

    awk取出指定行,如第20行

    cat /etc/hosts | awk 'NR==20'

    awk取出偶数行

    awk 'NR % 2 == 0' /etc/passwd

    awk取出有3列的行

    cat /etc/hosts | awk 'NF==3'

    打印出指定列

    cat /etc/hosts | awk '{print $2}'

    打印出最后一列,列的长度参差不齐,也是打印最后一列

    cat /etc/hosts | awk '{print $NF}'

    利用求余数的方法取出某文件的随机一行

    countline=`cat swapfile | wc -l`
     awk "NR==$(($RANDOM%$countline))" swapfile

    指定分隔符为=号

    awk -F '=' '{print $2}'

    分析日志中 请求的 host 是 my.jpuyy.com 且 状态是200

    tail -n 10  nginx_access.log | awk -F' '  '$2=="my.jpuyy.com" && $10==200 {print $10}'

    $0代表了全部,打印全部 {print $0}

    tail -n 10  nginx_access.log | awk -F' '  '$2=="my.jpuyy.com" && $10==200 {print $0}'

    打印每一个filed

    echo '11,13,15,61,3' | awk -F ',' '{for (i=1; i<=NF; i++) print $i}'

    打印时与字会串拼接,用双引号引起来

    echo '11,13,15,61,3' | awk -F ',' '{for (i=1; i<=NF; i++) print "192.168.1."$i}'

    awk 与 grep 等价命令

    cat my.log | grep error
    等同于
    awk '$0 ~ "error" {print $0}' my.log

    使用 printf 打印指定格式
    下面是取出 nginx log 中 GET 请求,把其中 $3, $9 以 , 分隔,并加上换行输出到 csv 中

    cat nginx_access.log-20160410 | awk '$8=="GET" {printf "%s,%s\n", $3,$9}' >> nginx_access.log-20160410.csv

    把指定列做加法,如最后一列

    awk '{sum+=$NF} END {print sum}'

    把最后一列踢除掉

    awk '{$NF=""; print $0}' file

    全部变为大写

    awk '{print tolower($0)}'

    全部变为小写

    awk '{print toupper($0)}'

    统计目录大小,包含 G 的目录

    du -sh * | awk '$1 ~ /G/ { print }'
    

    打印 hostname 前三个字符

    hostname  | awk '{print substr($0,1,3)}'
    hostname | cut -c 1-3
    echo ${HOSTNAME:0:3}
    

    奇数行和偶数行合并

    awk 'NR%2==0 {print p" "$0;} NR%2 {p=$0;}' 
    
  • shell数组使用

    shell数组的定义可以通过如下方式
    (1) array=(var1 var2 var3 … varN) 直接写每个元素的value
    (2) array=([0]=var1 [1]=var2 [2]=var3 … [n]=varN) 写形式[下标]=value
    (3) 对每一个变量分开定义
    array[0]=var1
    arrya[1]=var2

    array[n]=varN

    可以发现shell数组下标是确定的,有一个备份实践一下array的使用

    #!/bin/bash

    arrayip=(
    [0]=192.168.1.15
    [1]=192.168.1.16
    )

    arraypath=(
    [0]=/home/www/bbs
    [1]=/home/www/user
    )

    i=0

    while [ “$i” -lt “${#arrayproject[@]}” ] ; do
    rsync -a root@${arrayip[$i]}:${arraypath[$i]} /backup/
    i=`expr $i + 1`
    done

  • tee命令

    The tee utility copies standard input to standard output, making a copy in zero or more files. The output is unbuffered.

    将date执行的命令保存到文件里

     date > today.txt

    将date的输出传到today.txt,且打印到屏幕上

     date | tee today.txt

    结合管道命令,实现更多功能,比如cron文件如下

    */10 * * * * /usr/sbin/ntpdate 192.168.1.22
     15 5 * * * touch /tmp/nginx/fcgi

    现在需要将cron备份,并将ip更换为192.168.1.88,使用tee可实现备份并修改

    crontab -l | tee cron.backup | sed 's/192.168.1.22/192.168.1.88/g' | crontab -

    tee后面跟文件,会默认将输出覆盖到文件中,如果使用追加模式,加-a

    date | tee -a today.txt

    如果追加到多个文件

    date | tee today1.txt today2.txt today3.txt

    在vim中当用户没有权限保存文件时,使用root来tee输出到此文件(%在vim中表示当前文件),这时会提示文件有变动,就会保存成功。

    :w !sudo tee % > /dev/null

  • rabbitmq添加用户

    现添加admin,密码admin,管理员权限

    add_user  
    rabbitmqctl add_user admin admin
    rabbitmqctl list_users
    rabbitmqctl set_user_tags admin administrator
    rabbitmqctl list_users
    

    添加成功后赋权限

    rabbitmqctl set_permissions -p / myuser ".*" ".*" ".*"

    测试用户名密码正确性

    curl -i -u 'admin':'123456'  rabbitmq.foobar.io:15672/api/whoami
    
  • time命令

    time命令用于计算一个命令执行的时间

    例如sleep 2运行时间是2秒钟

    /usr/bin/time sleep 2
    0.00user 0.00system 0:02.00elapsed 0%CPU (0avgtext+0avgdata 2656maxresident)k
    0inputs+0outputs (0major+211minor)pagefaults 0swaps

    time后面可以加很多参数,如-o output.txt将结果输出到文件

    /usr/bin/time -o output.txt sleep 2

    -f “%P” command 可以按需求输出cpu使用率

    /usr/bin/time -f "%P cpu percentage" find ./ -name abc

     -f “%M” command 可以按需求输出内存使用率,

    /usr/bin/time -f "%M Max Resident Set Size (Kb)" find ./ -name abc

    -f “%e” command 按秒输出命令执行的时间

    /usr/bin/time -f "%e running time (sec)" find ./ -name abc

    参考

    12 UNIX / Linux Time Command Output Format Option Examples

  • xargs使用方法

    xargs用于接收输出并将其做为参数传给后面的命令,如

    ls /etc/hosts | xargs cat

    如果想要编辑多个eth文件

    ls /etc/sysconfig/network-scripts/ifcfg-eth* | xargs vim

    删除过滤到的文件

    ls index.html* | xargs rm -f

     接下来有一个很cool的功能,如果你按行在一个文件中记录了一些id号,想让一列变成两列,可以这样使用

    ➜  ~  cat myfile.txt 
    1
    2
    3
    4
    5
    6
    ➜  ~  xargs -n 2 < myfile.txt 
    1 2
    3 4
    5 6
    

    如果想要全部一行显示,-n后面加一个足够大的数字,则会显示一行

    ➜  ~  xargs -n 10 < myfile.txt
    1 2 3 4 5 6
    

    如果前面的输出为空,不执行后续操作的话,加入 -r 参数

    find . | grep aaa | xargs -r cat