Blog

  • 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

  • ansible-fetch获取服务器上的文件

    目标是获取两台服务器下root,www用户的crontab文件,并保存在本地的fetched目录。

    main.yml文件如下

    – hosts: all
    tasks:
    – fetch: src=/var/spool/cron/www dest=fetched/cron-www-{{ ansible_hostname }} flat=yes

    – fetch: src=/var/spool/cron/root dest=fetched/cron-root-{{ ansible_hostname }} flat=yes

    执行完之后的目录结构如下

    [[email protected] fetch-crontab]# tree
    .
    ├── fetched
    │   ├── cron-root-2.jpuyy.com
    │   └── cron-www-1.jpuyy.com
    ├── hosts
    └── main.yml

  • ansible使用笔记-改主机名

    针对所有主机修改主机名

    - hosts: all
     hostname: name={{ hostname }}
  • 通过python netsnmp读取cisco交换机信息

    首先使用snmpwalk跑一遍看一下有没有问题

    snmpwalk -v 2c -c public 10.103.33.1

    这里测试用交换机是 WS-C2960G-24TC-L,以下脚本用于读取管理ip,序列号,型号,主机名。思科的交换机snmp oid信息都可通过如下网址查询http://tools.cisco.com/Support/SNMP/do/BrowseOID.do

    首先安装python的snmp依赖包

    yum install net-snmp-python

    获取信息的脚本

    #!/usr/bin/env python
    # by yangyang89
    # using snmp get switch serial, model, manage ip ..
    import netsnmp
    import sys
    import urllib
    import urllib2
    
    # reference python for linux and unix administration page 209
    class Snmp(object):
        """A basic SNMP session"""
        def __init__(self,oid="sysDescr", Version=2):
            self.oid = oid
            self.version = Version
            self.destHost = sys.argv[1]
            self.community = sys.argv[2]
    
        def query(self):
            """Creates SNMP query session"""
            try:
                result = netsnmp.snmpwalk(self.oid, Version = self.version, DestHost = self.destHost, Community = self.community)
            except Exception, err:
                print err
                result = None
            return result
    
    print sys.argv[1] + sys.argv[2]
    if sys.argv[1] and sys.argv[2]:
        s = Snmp()
        #print s.query()
        #s.oid = "2.47.1.1.1.1.11.1001"
        #http://tools.cisco.com/Support/SNMP/do/BrowseOID.do
        s.oid = ".1.3.6.1.2.1.4.20.1.1" # manage ip ipAdEntAddr
        ip = s.query()
        telnet = ip[0]
        print "ip: " + telnet
        
        s.oid = ".1.3.6.1.4.1.9.3.6.3" # serial numbers chassisId
        serial = s.query()
        serial = serial[0]
        print "serial: " + serial
        
        s.oid = ".1.3.6.1.2.1.47.1.1.1.1" # product_model entPhysicalEntry
        product_model = s.query()
        product_model = product_model[1].split(' ')[0]
        print "product_model: " + product_model
        #print s.query()
        
        s.oid = ".1.3.6.1.4.1.9.2.1.3" # hostname hostName
        hostname = s.query()
        hostname = hostname[0]
        print "hostname: " + hostname
    
    
  • macOS terminal.app 设置

    基本上都用terminal.app, 使用多标签页,快捷键如下

    打开新的窗口

    command + n

    打开新的标签页

    command + t

    关闭当前标签页

    command + w

    tab互相切换

    command + shift + { 上一个tab
    command + shift + } 下一个tab

    shell 配置页
    when the shell exits: close if the shell exited cleanly

    terminal 设置

    Grass Courier 16 pt.
    使用标准键盘的小键盘 偏好设置 – 高级 – uncheck 允许VT100应用程序 小键盘模式