为了捞取日志,自己用python写了一些东西,大致套路就是读取写入文件的操作,放到linux上跑。实际使用时发现要操作的文件有时比较大,直接打开文件找需要的东西可能会有一些效率问题。所以学习一下shell脚本,看一下能不能用这种方法来直接监听日志取到需要的东西。以下是自己学习时的一些笔记。

Shell脚本的运行

shell脚本第一行一般都是如下内容。#!开头,告诉系统使用什么解释器(使用哪一种Shell)

#!/bin/bash

如何运行:

两种方法。

作为可执行程序的话,cd到相应目录后,运行以下命令

chmod +x ./test.sh  #使脚本具有执行权限
./test.sh #执行脚本。一定要写成./test.sh,意味着在当前目录找。
# 如果直接写test.sh,系统会去PATH里找test.sh,而PATH里一般只有/bin, /sbin, /usr/bin,/usr/sbin

或者可以直接sh test.sh。这样的话不用在第一行指定解释器

数据类型

变量

变量定义:等号两端不能有空格

变量可以指定为只读变量。只读变量的值不可以再改变。前面加readonly(比如,readonly aaa)

变量使用:在变量名前加dollar符。变量名外用大括号括起来,以表明变量的边界(比如${aaa}像这样)

只有使用变量时才加$。如果是给变量重新赋值则不需要

删除变量(非只读变量才可以被删除):

unset variable_name

字符串

字符串可以用单引号、双引号,也可以不用引号。

区别:

单引号:单引号内内容原样输出,变量无法生效。单引号内不能有单个的单引号,必须成对出现

双引号:可以有变量,可以有转义字符

字符串长度

${#variable_name} # 井号获取长度

截取字符

${variable_name:startInd:endInd} # 截取第startInd个字符到第endInd个字符

查找字符串

echo `expr index "$variable_name" io`  # 查找字符串中第一个符合条件的字符位置。io表示查找条件是i或者o
# 注意expr后面是`不是'

数组

bash只支持一维数组,初始化不需要指定大小。元素之间用空格分隔

array_name=(value1 ... valuen)

也可以使用下标指定值

array_name[]=value

读取数组:

跟变量一样,用${}括起来

${array_name[ind]}

获取数组中所有元素使用*或者@符号

${the_array[*]}
${the_array[@]}

获取数组长度和获取字符串的长度一样,用#号

${#the_array[*]}
${#the_array[@]}

一些命令:

echo和printf

echo和printf都是用于字符串输出。

printf比使用echo移植性好,因为printf由POSIX标准定义。

echo

显示普通字符串和显示转义字符串

echo "It is a test" # 显示普通字符串
echo It is a test # 等同于带引号情况
echo "\"It is a test\"" # 显示转义字符
echo \"It is a test\" # 等同于带引号的情况

显示变量。以下代码完成的是读取输入,然后打印结果

test.sh

执行sh test.sh后结果为 OK It is a test

#!/bin/sh
read name # 读取输入,指定给name变量
echo "$name It is a test" # 打印变量值和固定文本的组合结果

显示换行

echo -e "OK!\n"    # -e 开启转义
echo "It is a test"

显示不换行

#!/bin/sh
echo -e "OK!\c" #\c是不换行
echo "It is a test"

显示结果定向到文件

echo "It is a test" > myfile

原样输出字符串,不转义不取变量值

echo '$name\"'   # 输出结果是$name\"

显示命令执行结果

echo `date`  # 使用反引号`

# 打印结果是当前日期时间,精确到秒
# Thu Jul 24 10:08:46 CST 2014

printf

printf语法:

printf  format-string  [arguments...]

格式化的时候有一些格式替代符,比如%s(字符串),%c(这个没查到给谁占位,待补充),%d(十进制整数),%f(浮点数)

%-10s表示宽度为10个字符(-表示左对齐,不写-就表示右对齐),不足则以空格自动填充,超过的话会将内容全部显示

%-4.2f指格式化为小数,.2表示保留2位小数

一些其他用法

printf %s abc def # 如果只指定了一种格式,后面给了多个参数,那么所有参数都用格式化的要求来输出

如果没有给出参数,那么输出时%s用NULL代替,%d用0代替

反义序列

\a:警告字符

\b:后退

\c:抑制(不显示)输出结果中任何结尾的换行字符(只有靠%b格式来控制参数时有效)

\f:换页

\n:换行

\r:回车

\t:水平制表符

\v:垂直制表符

\\:反斜杠字符

\ddd:表示1到3位数的八进制值的字符。仅在格式字符串中有效

\0ddd:表示1到3位的八进制值字符

test

用于检查某个条件是否成立。可以进行数值、字符、文件的测试

数值测试

-eq:等于

-ne:不等于

-gt:大于

-ge:大于等于

-lt:小于

-le:小于等于

字符串测试

=:等于

!=:不等于

-z:是0

-n:非0

文件测试

-e 文件名:文件存在为真

-r 文件名:文件存在且可读为真

-w 文件名:文件存在且可写为真

-x 文件名:文件存在且可执行为真

-s 文件名:文件存在且至少有一个字符则为真

-d 文件名:文件存在且为目录则为真

-f 文件名:文件存在且为普通文件则为真

-c 文件名:文件存在且为字符型特殊文件则为真

-b 文件名:文件存在且为块特殊文件则为真

Shell脚本学习 - 基本内容以及数据格式的更多相关文章

  1. Shell 脚本学习资料搜集

    Shell文档 ChinaUnix上大神“網中人”总结的Shell十三问,强烈推荐,这本书讲得比较精炼,而且都是一些Shell学习中容易把握不住的一些细节难点.每一问都写得非常精彩.ChinaUnix ...

  2. 转 shell脚本学习指南

    shell脚本学习指南 以下八点不敢说就能成为你shell脚本学习指南de全部,至少可以让你编写出可靠的shell脚本. 1. 指定bashshell 脚本的第一行,#!之后应该是什么?如果拿这个问题 ...

  3. shell脚本学习总结02--数组

    bash同时支持普通数组个关联数组,普通数组只能使用整数作为数组的索引,关联数组可以使用字符串作为数组的索引. 数组的定义方法: 在单行中使用一列值定义一个数组 [root@new ~]# array ...

  4. Shell脚本学习指南笔记

    Shell脚本学习指南 作者:Danbo 2015-8-3 脚本编程语言与编译型语言的差异 许多中型.大型的程序都是用编译型语言写的,例如:C.C+.Java等.这类程序只要从源代码(Source C ...

  5. shell脚本学习之6小时搞定(1)

    shell脚本学习之6小时搞定(1) 简介 Shell是一种脚本语言,那么,就必须有解释器来执行这些脚本. Unix/Linux上常见的Shell脚本解释器有bash.sh.csh.ksh等,习惯上把 ...

  6. 笔记——shell脚本学习指南

    <shell脚本学习指南>机械工业出版 ISBN 987-7-111-25504-8 第2章 2.4 初级陷阱 1.当今的系统,对#!这一行的长度限制从63到1024个字符都有,尽量不要超 ...

  7. 学习笔记之Shell脚本学习指南 & sed与awk & 正则表达式

    正则表达式_百度百科 http://baike.baidu.com/link?url=ybgDrN2WQQKN64_gu-diCqdeDqL8LQ-jiQ-ftzzPaNUa9CmgBRDNnyx50 ...

  8. Shell脚本学习 - 运算符

    继续shell脚本学习.上一篇是基本数据类型和语法的总结,这一篇是运算相关的操作. 运算符 bash不支持简单的数学计算,需要依赖其他命令实现. expr可以代为实现. # 表达式一般这么写 ` + ...

  9. shell脚本--显示文本内容

    shell脚本显示文本内容及相关的常用命令有cat.more.less.head.tail.nl 首先是cat,cat最常用的就是一次性显示文件的所有内容,如果一个文件的内容很多的话,那么就不是很方便 ...

随机推荐

  1. 【转载】VS写汇编程序01:VS2015配置汇编语言开发环境

    https://blog.csdn.net/qq_28249373/article/details/83475107

  2. spring-cloud-sleuth 和 分布式链路跟踪系统

    ==================spring-cloud-sleuth==================spring-cloud-sleuth 可以用来增强 log 的跟踪识别能力, 经常在微服 ...

  3. JGUI源码:实现图标按钮及下拉菜单(16)

    效果如下 代码片段如下 <div class="jgui-btn" id="personalbtn" style="float:right;&q ...

  4. OSPFv3实验配置(GNS3)

    实验目的 1. 掌握 OSPFv3(v2) 的配置方法 2. 掌握在帧中继环境下 OSPFv3 (v2)的配置方法 3. 掌握 OSPFv3(v2) NSSA 的配置方法 4. 掌握外部路由汇总的配置 ...

  5. 一、C语言调试—— gdb 的使用

    1.1 gdb 调试工具常用命令 list:展开调试的源代码,缩写 l: break:设置断点,缩写为 b: info break:查看断点信息,缩写为 i b delete:删除断点 print:打 ...

  6. (四)Python中的“四大才子”(字符串、列表、字典、集合)

    前戏:在python中把数据序列分为可变(mutable)和不可变(immutable)两种 不可变:string.int.float.tuple 特点:相同对象只是占用一个内存地址,不管有多少个变量 ...

  7. ccf 201903-5 317任务

    [题目背景]“你在平原上走着走着,突然迎面遇到一堵墙,这墙向上无限高,向下无限深,向左无限远,向右无限远,这墙是什么?”——<流浪地球>原著我们带着地球去流浪了,为了处理流浪过程中可能会发 ...

  8. Luogu P4358 密钥破解 题解报告

    题目传送门 [题目大意] 给定一个正整数N,可以被分解为两个不同的质数p和q,计算出r=(p-1)*(q-1). 然后给出了一个小于r且与r互质的整数e,已知e*d≡1(mod r),求d. 最后给定 ...

  9. Maven将代码及依赖打成一个Jar包的方式

    Maven可以使用mvn package指令对项目进行打包,如果使用java -jar xxx.jar执行运行jar文件,会出现"no main manifest attribute, in ...

  10. Springboot2新特性概述

    官方说明: https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-2.0-Release-Notes 起码 JDK 8 和支持 ...