shell的常用处理:https://github.com/dylanaraps/pure-bash-bible

-d作为分隔符:read xargs
-t作为分隔符:sort

-F作为分隔符:awk

字符串替换:b=${a/123/321};将${a}里的第一个123替换为321

for循环:
#!/usr/bin/env bash
for((i=;i<;i++))
do
echo $i
done

全部:  ls -a

递归:ls -R

通配符(过滤):ls *.sh

通配符:cp *.sh  /home/tst

每个文件或目录都有唯一的inode编号 ,可以给ls命令加入-i参数 查看:ls -i sdf.sh

创建多级目录加-p参数:mkdir -p /tst/aa/bb/cc
用file可以查看文件的编码:

file DayStatistic.py
DayStatistic.py: Python script, UTF- Unicode text executable

less命令是more的升级版本,支持更多的命令

显示倒数两行: tail -2 log_file
显示正数两行:head -2 log_file

==========  top

S:进程的状态(D代表可中断的休眠状态, R代表在运行状态, S代表休眠状态, T代表跟踪状态或停止状态, Z代表僵化状态)

============

pkill 或 killall支持通过进程名而不是PID来结束进程。
mount命令会输出当前系统上挂载的设备列表

mount | head -
sysfs on /sys type sysfs (rw,nosuid,nodev,noexec,relatime,seclabel)
proc on /proc type proc (rw,nosuid,nodev,noexec,relatime) 媒体的设备文件名 挂载点 文件系统类型 媒体的访问状态

===============

sort -n  :-n 告诉sort命令把数字识别成数字而不是字符,并且按值排序

 /etc/passwd 内容如下:
rpc:x:::Rpcbind Daemon:/var/lib/rpcbind:/sbin/nologin
rpcuser:x:::RPC Service User:/var/lib/nfs:/sbin/nologin
nfsnobody:x:::Anonymous NFS User:/var/lib/nfs:/sbin/nologin
sshd:x:::Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
postfix:x::::/var/spool/postfix:/sbin/nologin cat /etc/passwd |sort -t ":" -k -n # 参数来指定字段分隔符,然后用-k参数来指定排序的字段 root:x:::root:/root:/bin/bash
bin:x:::bin:/bin:/sbin/nologin
daemon:x:::daemon:/sbin:/sbin/nologin
adm:x:::adm:/var/adm:/sbin/nologin
lp:x:::lp:/var/spool/lpd:/sbin/nologin
sync:x:::sync:/sbin:/bin/sync

==============

执行多条命令,命令直接通过 &&连接,前一条命令执行成功,才会执行后面一条,如:cd /temp/log/&&rm -rf *

快速清空一个文件:>filename

复制粘贴:ctrl+insert  shift+insert

冻结屏幕:ctrl + s

退出冻结:ctrl+q

在没有vim时,编辑一个空文件:cat >file.txt   ,ctrl+d 退出编辑

=================

/etc/passwd 里保存了每个用户默认的shell程序,还保存了用户名和uid的对应关系;root的UID是0

passwd 用来修改密码,不加参数,则修改自己的,加了参数,则修改别人的,但只有root用户可以修改别人的

创建全局环境变量的方法是先创建一个局部环境变量,然后再把它导出到全局环境中;在unset命令中引用环境变量时,记住不要使用$

my_variable="I am Global now"
export
my_variable
unset my_variable

/etc/profile文件是bash shell默认的的主启动文件。只要你登录了Linux系统, bash就会执行/etc/profile启动文件中的命令

最好是在/etc/profile.d目录中创建一个以.sh结尾的文件。把所有新的或修改过的全局环境变量设置放在这个文件中
在大多数发行版中,存储个人用户永久性bash shell变量的地方是$HOME/.bashrc文件。
有时数组变量会让事情很麻烦,所以在shell脚本编程时并不常用。对其他shell而言,数组变量的可移植性并不好
将用户rich加入shared组 :usermod -G shared rich   # 如果加了-g选项,指定的组名会替换掉该账户的默认组。 -G选项则将该组添加到用户的属组的列表里,不会影响默认组

==================
查看所有的用户:cat /etc/passwd
查看所有的用户组:cat /etc/group
改用户:chown rpc Dockerfile

改组:chown .centos Dockerfile

改用户和组:chown alauda.alauda Dockerfile

==============vim中的操作

G:移到缓冲区的最后一行
num G:移动到缓冲区中的第num行
gg:移到缓冲区的第一行
s/old/new/g:一行命令替换所有old

%s/old/new/g:替换整个文件中的所有old
%s/old/new/gc:替换整个文件中的所有old,但在每次替换时进行确认

===========

赋予文件属主执行文件的权限:chmod u+x test1 # a+x 是给大家都加上执行权限
使用等号将值赋给用户变量。在变量、等号和值之间不能出现空格

有两种方法可以将命令输出赋给变量: 反引号字符(`) $()格式   例如:tst=`ls -a`     aa=$(ls -a)
==============

文件重定向用 <

内联输入重定向:这种方法无需使用文件进行重定向,只需要在命令行中指定用于输入重定向的数据就可以了 。内联输入重定向符号是远小于号(<<)。

除了这个符号,你必须指定一个文本标记来划分输入数据的开始和结尾,常用EOF

wc << EOF
> NICE EOF --这里的EOF么用,要单独一行的EOF才管用
> EOF

================

不要以为由管道串起的两个命令会依次执行。 Linux系统实际上会同时运行这两个命令,在系统内部将它们连接起来。在第一个命令产生输出的同时,输出会被立即送给第二个命令。数据传输不会用到任何中间文件或缓冲区

=============== bash shell只能处理整数 ,不能处理浮点型

通过上下键查看大文件:cat /etc/group | less

在bash中,在将一个数学运算结果赋给某个变量时,可以用美元符和方括号($[ operation ])将数学表达式围起来 :var1=$[1 + 5]
进行浮点数计算 bc :variable=$(echo "options; expression" | bc)

var1=$(echo "scale=4;3.51/4" | bc)  --scale 指明保留几位小数
echo $var1 .

===================

可以通过exit 在适当的位置退出,但要注意,返回值范围是0~255

字符串进行比较时,为了不把> 或< 当作重定向使用,需要进行转义,或者改用双括号,双括号里不用转义,双括号里可以使用高级的数学运算

双方括号支持正则匹配

myfun()
{
item="sdf1"
var="sdf2"
if [ $item \> $var ]
then
echo "have"
else
echo "not have"
fi
}

myfun()
{
item="sdf1"
var="sdf2"
if (( $item > $var ))
then
echo "have"
else
echo "not have"
fi
}

=================

==============

while命令允许你在while语句行定义多个测试命令。只有最后一个测试命令的退出状态码会被用来决定什么时候结束循环 。若最后一个命令放的不对,可能造成死循环

myfun()
{
var1=
while
echo $var1
[ $var1 -gt ]
do
var1=$[ $var1 -]
done
}

until命令要求你指定一个通常返回非零退出状态码的测试命令。只有测试命令的退出状态码不为0, bash shell才会执行循环中列出的命令。

myfun()
{
var1=
until [ $var1 -eq ]
do
echo $var1
var1=$[ $var1 -]
done
}

==============

break n 跳出循环:默认情况下, n为1,表明跳出的是当前的循环。如果你将n设为2, break命令就会停止下一级的外部循环 【外部循环跳出了,当然内部循环也就结束了】

var1=

while [  $var1 -lt  ]
do
var1=$[ $var1+ ]
echo "var1:" $var1
for (( a=;a<;a++ ))
do
echo $a
if [ $a -eq ]
then
break
fi
done
done
结果:

var1: 1
0
1

continue 后面也支持加 n

=========================

done 后面可以加重定向,也可加管道符

var1=

while [  $var1 -lt  ]
do
var1=$[ $var1+ ]
echo "var1:" $var1
done > cc.txt 结果:
cat cc.txt
var1:
var1:
var1:
for var1 in /home/alauda/temp/*
do
echo "var1:" $var1
done | sort

====================

向脚本传参数时,每个参数用空格分开

$0是程序名, $1是第一个参数, $2是第二个参数,依次类推,直到第九个参数$9。 如果脚本需要的命令行参数不止9个, 必须在变量数字周围加上花括号,比如${10} 
basename命令会返回不包含路径的脚本名

var1=` basename $ `
echo $var1

判断参数是否存在 -n

if [ -n "$2" ]  --要引起来,否则不对
then
echo "exists"
else
echo "not exists"
fi

获取最后一个元素:echo ${!#}

$#:传入脚本的参数个数

=========

$*变量会将所有参数当成单个参数,而$@变量会单独处理每个参数

=============
read命令包含了-p选项,允许你直接在read命令行指定提示符。 -t 指定了read命令等待输入的秒数

if read  -p "your name :" name
then
echo $name
else
echo "too slow"
fi

也可以在read命令行中不指定变量。如果是这样, read命令会将它收到的任何数据都放进特殊环境变量REPLY

read -t  -p "your name :"
echo "name :"$REPLY

=======================
默认情况下, STDERR文件描述符会和STDOUT文件描述符指向同样的地方(尽管分配给它们
的文件描述符值不同)。也就是说,默认情况下,错误消息也会输出到显示器输出中

============

重定向错误输出:ls zz tst 2>error
将正常输出和错误输出重定向到不同的文件:ls zz tst 1>info 2>error

正常输出和错误输出重定向到一个文件:ls zz tst &> info  【当使用&>符时,命令生成的所有输出都会发送到同一位置,包括数据和错误 】

阻止命令输出:ls > /dev/null

将输出同时发送到显示器和日志文件 :tee 【它将从STDIN过来的数据同时发往两处。一处是STDOUT,另一处是tee命令行所指定的文件名】
date | tee testfile
=============
以后台模式运行shell脚本非常简单。只要在命令后加个&符就行了。 命令作为系统中的一个独立的后台进程运行 :./test1.sh & 
退出终端后,后台进程仍运行:nohup ./test1.sh &
=====================

函数的定义要在 函数调用之前

若函数最后一行执行成功,则函数返回值是0,即使函数中前面几句话执行失败

$#来判断传给脚本或函数的参数数目。

===========
函数可以访问脚本中定义的全局变量,但不能访问 $1 $2

============

lst=(     )
echo $lst -----lst是一个数组,要想获取数组全部元素需要用${lst[*]},$lst只能获取第一个元素
echo ${lst[*]}

=================

要在sed命令行上执行多个命令时,只要用-e选项就可以了 ,多个命令之间用分号分隔

sed -e 's/brown/green/; s/dog/cat/' data1.txt

sed -ie 's/aaa/111/g;s/bbb/333/g' bb
====================

gawk程序脚本用一对花括号来定义 ;由于gawk命令行假定脚本是单个文本字符串,你还必须将脚本放到单引号中

 $0代表整个文本行;
 $1代表文本行中的第1个数据字段;
 $2代表文本行中的第2个数据字段;
 $n代表文本行中的第n个数据字段

gawk中执行多条命令,只要在命令之间放个分号即可 :echo "My name is Rich" | gawk '{$4="Christine"; print $0}'

==================

EOF(End-of-File)
==============

xargs 能够将输入数据转化为特定命令的命令行参数
-I {} 指定替换字符串,这个字符串在xargs扩展时会被替换掉,用于待执行的命令需要多个参数时

将进程的IO情况记入文件
iotop -d 60 -toP > /home/ubuntu/zcy/iotop.log

sort:-n 按数字进行排序 VS -d 按字典序进行排序

消除重复行
sort unsort.txt| uniq
统计各行在文件中出现的次数
sort unsort.txt | uniq -c
找出重复行
sort unsort.txt | uniq -d

统计行数:wc -l file
统计单词数 wc -w file
统计字符数wc -c file

awk脚本结构:
awk ' BEGIN{ statements } statements2 END{ statements } '
1.执行begin中语句块;
2.从文件或stdin中读入一行,然后执行statements2,重复这个过程,直到文件全部被读取完毕;
3.执行end语句块;

echo -e "line1 line2" | awk 'BEGIN{print "start"} {print } END{ print "End" }' #使用不带参数的print时,会打印当前行

shell 学习笔记2的更多相关文章

  1. SHELL学习笔记----IF条件判断,判断条件

    SHELL学习笔记----IF条件判断,判断条件 前言: 无论什么编程语言都离不开条件判断.SHELL也不例外.  if list then           do something here   ...

  2. shell学习笔记

    shell学习笔记 .查看/etc/shells,看看有几个可用的Shell . 曾经用过的命令存在.bash_history中,但是~/.bash_history记录的是前一次登录前记录的所有指令, ...

  3. [转帖][Bash Shell] Shell学习笔记

    [Bash Shell] Shell学习笔记 http://www.cnblogs.com/maybe2030/p/5022595.html  阅读目录 编译型语言 解释型语言 5.1 作为可执行程序 ...

  4. shell学习笔记汇总

    1.shell脚本中函数使用 函数定义在前,调用在后,顺序反了就没有效果了.函数调用为:函数名 参数列表 函数内部通过以下变量访问函数的参数:shell脚本函数中: $0: 这个脚本的名字 $n: 这 ...

  5. shell 学习笔记2-shell-test

    一.字符串测试表达式 前面一篇介绍:什么是shell,shell变量请参考: shell 学习笔记1-什么是shell,shell变量 1.字符串测试表达式参数 字符串需要用""引 ...

  6. SHELL学习笔记三

    SHELL学习笔记一 SHELL学习笔记二 SHELL学习笔记三 for 命令 读取列表中的复杂值 从变量读取列表 从命令读取值 更改字段分隔符 用通配符读取目录 which 使用多个测试命令 unt ...

  7. 【转】shell学习笔记(一)——学习目的性、特殊字符、运算符等

    1 学习shell的目的性 写之前我们先来搞清楚为什么要学shell,学习要有目的性 shell简单.灵活.高效,特别适合处理一些系统管理方面的小问题 shell可以实现自动化管理,让系统管理员的工作 ...

  8. [Bash Shell] Shell学习笔记

    1. Shell简介 Shell本身是一个用C语言编写的程序,它是用户使用Unix/Linux的桥梁,用户的大部分工作都是通过Shell完成的.Shell既是一种命令语言,又是一种程序设计语言.作为命 ...

  9. shell 学习笔记

    <Linux命令行与shell脚本编程大全>笔记   wkss 其他:http://www.cnblogs.com/pengdonglin137/p/3528303.html 一.基本命令 ...

  10. CentOS 7 之Shell学习笔记

    脚本是个永恒的话题,以前Dos下面也有Shell编程这一说的,比如说BAT文件有人写的好的话,也是瞬间速度变高大上.Linux下面这个应该更占比重了.我看到园子里有位园友做了一个Linux Shell ...

随机推荐

  1. memmove和memcpy函数的区别及实现

    一.memmove()和memcpy()函数和strcpy()函数的区别: (1)使用的类型不同,strcpy()函数只对字符串进行操作:memmove()和memcpy()函数对所有类型都适用,为内 ...

  2. Java注解-注解处理器、servlet3.0|乐字节

    大家好,我是乐字节的小乐,上次给大家带来了Java注解-元数据.注解分类.内置注解和自定义注解|乐字节,这次接着往下讲注解处理器和servlet3.0 一.注解处理器 使用注解的过程中,很重要的一部分 ...

  3. LeetCode 278. 第一个错误的版本(First Bad Version)

    278. 第一个错误的版本 LeetCode278. First Bad Version 题目描述 你是产品经理,目前正在带领一个团队开发新的产品.不幸的是,你的产品的最新版本没有通过质量检测.由于每 ...

  4. (五)Spring Boot官网文档学习

    文章目录 SpringApplication SpringApplication 事件 `ApplicationContext ` 类型 访问传递给 `SpringApplication` 的参数 A ...

  5. 简单layer 快速上手

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  6. Scrapy框架1——简单使用

    一.设置与编写 打开cmd,选择好路径 1.创建项目scrapy startproject projectname d:\爬虫\11.scrapy>scrapy startproject tes ...

  7. 【Qt】Qt5.12编译MySQl5.7驱动(亲自测试成功)

    目录 00. 目录 01. 安装Qt5.12 02. 打开MySQL源码项目 03. 编译MySQL驱动代码 04. 修改mysql.pro文件 05. 编译之后得到对应的库 06. 拷贝动态库到指定 ...

  8. 【LEETCODE】36、121题,Best Time to Buy and Sell Stock

    package y2019.Algorithm.array; /** * @ProjectName: cutter-point * @Package: y2019.Algorithm.array * ...

  9. PB笔记之取项次最大值(即使用.describe(" evaluate('ITM_max',0) ") 获取列的最大值) 的条件

    dw_1.describe(" evaluate('ITM_max',0) ")  :使用 describe 配合 evaluate 取列的最大最小值(或其它表达式)时,必须在数据 ...

  10. Generator 实现

    Generator 是 ES6 中新增的语法,和 Promise 一样,都可以用来异步编程 // 使用 * 表示这是一个 Generator 函数 // 内部可以通过 yield 暂停代码 // 通过 ...