shell awk

4 篇文章 0 订阅

学习linux很长时间了大概两年前开始接触linux吧,但是总有些时候某某命令很熟悉,可是就是没有熟练应用,导致每次都百度,因为没有笔记,所以回忆起来非常的难,所以这个笔记是非常有必要的。


grep 的基本语法

grep [-avein] '搜索字符串'  filename

-a 就是将读取的filename当做文本看待,默认是二进制的
-v 反选,除了选中的
-e 这个就是大名鼎鼎的正则了
-i ignore的缩写,忽略大小写
-n 显示行号
-q 静默模式,不输出
-A 显示匹配的上文信息
-B 显示匹配的下文
-C 显示匹配的上下文
-r 递归查找

----------
Samples
grep -ae 'weixinscan notify param' default_20160120.log |tail -n 1
grep -e "^[a-zA-Z]" filename

#查找某个目录下面所有文件的内容是否包含某些字符串
grep -re "size.*100000" filename

sed的语法

sed [option] [address] command filename

sed 当中几个常用的命令:

  • s 替换
  • d 删除
  • a 追加
  • i 插入
  • c 修改
sed "s/^/#/" sed2 
sed "s/is/[&]/" sed2 
sed "s/Jon/Jonathan/" 1.txt
sed "1,3d" 1.txt
sed "5,10! d" 1.txt
sed "/Lane/ d" 1.txt 5.
sed "/^Fred/ s/^/***/" 1.tx
sed "/Jose/ s/^.*$/JOSE HAS RETIRED/" 1.txt
sed "s/[0-9]\/[0-9]\/[0-9]*/11\/14\/46/" 1.txt
sed "/^$/ d" 1.txt
sed -e "1 i PERSONNEL FILE" -e "$ a THE END" -e "/500$/d" -e "s/\([^\-]*\) \([^\-]*\):\(.*\)/\2 \1:\3/" 1.txt

#替换语法
[address]s/pattern/replacement/flags
flags的集中情况:
n 1到512的一个数字
g 和正则的G差不多
p 打印模式空间内容
w file 写入到文件

awk语法
awk '条件类型 1动作 |条件类型 2动作 … ’ filename

cat filename |awk '{print $` "\t" $3}'

cat filename |awk '{print $1 "\t lines:" NR "\t columes:" NF}'
#FS 分隔符 OFS输出分隔符  NR 行号  NF 列数

cat /etc/passwd | awk '{FS=":"} $3 < 10 {print $1 "\t" $3}'

cat /etc/passwd |awk 'BEGIN {FS=":"} $3< 10 {print $1 "\t" $3}'

# RS 行分隔符默认的是\n  ORS 输出分行符
#BEGIN和END相当于构造函数和析构函数

cat pay.txt | \
awk 'NR=1 {printf "%10s %10s %10s %10s %10s\n",$1,$2,$3,$4,"Total"}
NR >=2 {total=$2 + $3 + $4
printf "%10s,%10s,%10s,%10s,%10.2f\n",$1,$2,$3,$4,total}'
#这个awk表达式太牛叉了,一直条件然后表达式

awk中的分隔符

 #awk中默认是使用空格和指标符来分割的,然而这其实就是类似这样的
 FS="[ \t]"
 
 FS="\t" 
 #表示用一个制表符分割
 FS="\t+"
 #表示一个或者多个制表符分割,这里使用的就是正则里面的+号
 
 FS="[:;\t]"
#表示可以使用这三种符号来分割行
#突然觉得awk太任性了,怎么可以这样随意分割呢,相比cut方便百倍了

awk中使用正则表达式

awk '{if (/^[^;]/ ) {printf "%s\r\n",$0}}' /usr/lib/php.ini

# 这个例子就是使用正则表达式来匹配php.ini中不是;号开头的行,是不是很爽呢

ll -al |awk '{if (NR!=1 && $3 ~ /lion/) {print $3}}'

#如果awk中某个字段需要使用正则,这个时候使用~后面接正则表达式,这些情况
我们经常会遇到的吧

ll -al |awk '{if (NR!=1 && $3 !~ /lion/) {print $3}}'

#干死tomcat
sudo kill -9 `ps -ef |grep tomcat8.5 |awk '{if (NR == 1) {print $2}}'`
#加一个!感叹号就会成功取反
#简单的cut命令,获取:分割的第二段
cat /etc/passwd |cut -d ":" -f 2
sed -e "/#/d" nginx.conf |tr -s "\n" #查看干干净净的配置文件

#date命令详解


date --date=2016-03-28 +%s #日期转时间戳
date -d @234124214 #时间戳转日期
date -d now +%Y-%m-%d
date -d yesterday +%Y-%m-%d #昨天的时间
date -d tomorrow +%Y-%m-%d #明天的时间

date -d "-3 day" +%Y-%m-%d #前3天
date -d "+3 day" +%Y-%m-%d #后三天
function get_root_line() {
    while read line
    do
        if `echo $line|grep -q "mysql"`; then#判断是否包含了mysql这个字符串
            echo $line
        fi
    done < /etc/passwd
}


function get_root_line() {
    local str='helloworld'
    echo ${str:1:3}#类似substr的功能
}


function get_root_line() {
    local str='helloworld'
    echo $str | awk '{if (index($1,"x") > 0) {print "ok"} else {print "fail"}}'#index查找字符串中出现的位置,发现awk很多东西像一门完整的语言了,很厉害的工具
}

function main() {
    test_return
    if [ $? -eq 0 ]; then #这里判断函数的返回值,特别要注意test结构那些值返回的是真
        echo 'ok'
    else
        echo 'fail'
    fi
}

function test_return() {
    return -1
}
shell中test结构的误区
if [ 0 ]; then
	echo 'ok'#打印ok
if
if [ -1 ]; then
	echo 'ok'#打印ok,是不是有点蒙了呢,这他妈的不是-1吗,怎么回事ok呢,事情是这样的大家,test -1肯定是执行成功了,内核在解析shell是肯定也是返回真的
if

#比如我们看下面这段测试
if [ 3 -gt 2 ]; then
	echo '肯定ok啦'
if

`#下面来介绍一下shell中坑爹的数组操作咯;首先是申明一个数组
`arr=( bai xiao shi )#看到了吗,居然是括号,php中是array或者[];c语言中是{},然而这还挺新鲜

arr=( one two three four five six )
#打印第一个元素
echo ${arr[0]}
#打印第一个元素
echo ${arr:0}
#打印第一个元素从1开始的偏移量
echo ${arr:1}
#第一个元素的长度
echo ${#arr[0]}
#获取数组的长度
echo ${#arr[*]}
echo ${#arr[@]}
`#下面看看接参数的一些变量

$? #语句执行返回的结果
$# #参数个数
$* #全部参数 "1 2 3"
$@ #分别被引号包住  "1" "2" "3"
$1...$9 #第几个参数
`#继rsync一个好用的命令之外,另外一个命令更加方便在同步文件方面
scp source_file  target_file

scp ./array.sh baixs@172.16.173.163:/tmp#将本地的文件复制到远程
scp -r baixs@172.16.173.163:/tmp/array.sh ./ #将远程的文件复制到本地,太方便了我靠

当然如果中间有跳板机的话,还是要xmodel或者是zmodel啊

test语法


参数	说明
-eq	等于则为真
-ne	不等于则为真
-gt	大于则为真
-ge	大于等于则为真
-lt	小于则为真
-le	小于等于则为真


参数	说明
=	等于则为真
!=	不相等则为真
-z 字符串	字符串长度伪则为真
-n 字符串	字符串长度不伪则为真


参数	说明
-e 文件名	如果文件存在则为真
-r 文件名	如果文件存在且可读则为真
-w 文件名	如果文件存在且可写则为真
-x 文件名	如果文件存在且可执行则为真
-s 文件名	如果文件存在且至少有一个字符则为真
-d 文件名	如果文件存在且为目录则为真
-f 文件名	如果文件存在且为普通文件则为真
-c 文件名	如果文件存在且为字符型特殊文件则为真
-b 文件名	如果文件存在且为块特殊文件则为真

cd /bin
if test -e ./bash
then
    echo 'The file already exists!'
else
    echo 'The file does not exists!'
fi
#查看文件
cat /usr/local/hello.txt
#既查看也输出
cat /usr/local/hello.txt|tee outputfile.out
#xargs的用法
#杀死某个进程的方法,将前面的输出传到 xargs后面的shell命令作为参数
ps -ef |grep logstash|grep -v grep|awk '{print $2}'|xargs sudo kill -9

xargs命令的作用,是将标准输入转为命令行参数。

$ echo "hello world" | xargs echo



#!/bin/bash

APP_PATH=`pwd`
INSTALL="${APP_PATH}/installed"
PACKAGE_NAME="logstash-5.5.0"
TAR_NAME="${PACKAGE_NAME}.tar.gz"
TAR_PATH="${APP_PATH}/src/${TAR_NAME}"
CONFIG_PATH="${APP_PATH}/src/logstash.conf"

function install() {
    if [ -e "${APP_PATH}/install.lock" ]; then
        echo "logstash installed already, please remove install.lock to reinstall"
        exit 1
    fi

    rm -rf ${INSTALL}
    mkdir -p ${INSTALL} && chmod -R 777 ${INSTALL}
    cp ${TAR_PATH} ${INSTALL}
    cd ${INSTALL} && tar -zxvf ${TAR_NAME} && cp ${CONFIG_PATH} ${INSTALL}/${PACKAGE_NAME}/config/
    touch ${APP_PATH}/install.lock

    echo -e "install ok !\n please ${APP_PATH}/install.sh --help"

    exit 0
}

function check_run() {
    pid=`ps -ef |grep logstash|grep -v grep|awk '{print $2}'|xargs`
    if [ "$pid" != "" ]; then
        echo 1
    else
        echo 0
    fi
}

function start() {

    pid=`ps -ef |grep logstash|grep -v grep|awk '{print $2}'|xargs`
    if [ "$pid" != "" ]; then
        echo "logstash have started, please use restart"
        exit 1
    fi

    nohup ${INSTALL}/${PACKAGE_NAME}/bin/logstash -f ${INSTALL}/${PACKAGE_NAME}/config/logstash.conf 2>&1 &

    echo "start ok !"
    exit 0
}

function stop() {
    `ps -ef |grep logstash|grep -v grep|awk '{print $2}'|xargs kill -9`
}

function usage() {
    echo  "${APP_PATH}/install.sh options[install|start|stop|restart]"
}

if [[ $# -lt 1 || "$1" == "-h" || "$1" == "--help" ]]; then
   usage && exit 1
fi

CMD=$1
shift
case $CMD in
    install)
        install
        ;;
    start)
        start
        ;;
    stop)
        stop
        ;;
    restart)
        stop
        start
        ;;
    list)
        list_running_task
        ;;
    listall)
        list_ini_task
        ;;
    *)
        usage
        ;;
esac


查看文件哪一行数据出现的次数最多

cat num.txt|uniq -c| sort -k1 -nr
#将文件每行统计并逆序排序,看出哪一行出现的次数最多
 #查看和修改时间
date "+%Y-%m-%d %H:%M:%S"

date -s "2019-03-01 17:56:16"

#恢复时间
yum install -y ntpdate
 &&  ntpdate time.nist.gov 
 && ntpdate -u pool.ntp.org
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值