shell 学习笔记 LinuxShell脚本攻略(第2版)
注释用#号;多条命令通过分号或回车来分隔
echo会自动换行,若不想换行,则加上-n参数,如 echo -n "nice to meet you"
grep 'test' d* 显示所有以d开头的文件中包含test的行。
scp sourecFile romoteUserName@remoteIp:remoteAddr 远程拷贝
切换用户:su -username
tail -f exmaple.log 这个命令会自动显示新增内容,屏幕只显示10行内容的(可设置)。
netstat -tln | grep 8080 查看端口8080的使用情况
查看指定进程打开的文件:lsof -p $pid 【lsof一般用来查看进程打开的文件:list open file】
远程登录:ssh userName@ip
echo后面的内容可以不带引号,可以带单引号,也可以带双引号
对于进程来说,其运行时的环境变量可以使用下面的命令来查看:cat /proc/$PID/environ
若输出的结果连在一起了,说明结果之间由null字符(\)分隔,为了每个结果占一行,可以进行替换操作,如:cat /proc//environ | tr '\0' '\n'
注意, var = value不同于var=value。把var=value写成var = value是一个常见的错误,但前者是赋值操作,后者则是相等操作。
在变量名之前加上$前缀就可以打印出变量的内容
定义环境变量用export ;给已有环境变量追加值,也用export,如 export PATH="$PATH:/home/bin"
获取变量值的长度 # :echo ${#haha}
整数运算:no1=4;no2=5
[alauda@ip---- temp]$ let cc=no1+no2
[alauda@ip---- temp]$ echo $cc [alauda@ip---- temp]$ zz=$[no1+no2]
[alauda@ip---- temp]$ echo $zz
文件描述符
echo "sdfsdf">bb 覆盖式写入,文件里原来的东西会被清空
echo "what's wrong" >>bb 追加式写入
============
定义数组:sdf=(11 22 33) ----元素之间通过空格分隔
访问所以成员:echo ${sdf[*]}
打印数组长度:echo ${#sdf[*]}
=========调试========
打印出所执行的每一行命令以及当前状态:/bin/bash -x aa.sh
使用set -x和set +x对脚本进行部分调试 :
#!/bin/bash sdf=
echo $sdf
set -x
if [ $sdf = ]
then
echo "nice to meet you"
set +x
else
echo "not equal"
fi
=================函数
#!/bin/bash
myfun() ----定义函数
{
echo $@;
echo $;
return ;
}
myfun "aa" "bb" ; --调用函数
echo $? ---打印函数返回值
===============
从输入中读取n个字符并存入变量xx:read -n 3 xx
用特定的定界符作为输入行的结束: read -d ";" xx
echo -n 'ni;hao;ma;' |xargs -d ';'
ni hao ma
=====================
将字符串用逗号分隔,逐个打印 IFS存放的是 定界符
aiya()
{
echo $;
OLDIFS=$IFS;
IFS=",";
for item in $;
do
echo item:$item;
done
IFS=$OLDIFS;
echo "over over";
} aiya "ni,hai,hao,ma"
结果:
ni,hai,hao,ma
item:ni
item:hai
item:hao
item:ma
over over
================循环
若在if后面放的不是命令,则要通过test或 [ ] 实现,如判断变量是否有值、判断是否相等,都需要[]
myfun()
{
item=""
if [ $item ] --------[] 第一个方括号之后和第二个方括号之前必须加上一个空格 then
echo "have"
else
echo "not have"
fi
}
输出是 not have
aiya()
{
echo $;
if [ $ == ]
then
echo '';
elif [ $ == ]
then
echo ''
else
echo ''
fi }
aiya ; ---调用
myfun()
{
for item in $;
do
echo $item
done
echo "ooooooooo"
}
==========条件语句=================
[ $1 == 1 ] && echo "success"
===============
添加行号:cat -n lines.txt
忽略名字大小写进行查找:find . -iname aa*
多条件查询:find . \( -name "*.txt" -o -name "*.sh" \)
用“!”否定参数的含义 :find . ! -name "*.sh"
只对当前目录进行查找:find . -maxdepth 1 -name "*.txt"
-atime、 -mtime、 -ctime 的单位是天,- 表示小于, + 表示大于
-amin -mmin -cmin的单位是分钟
删除查找到的匹配文件:find . -name "*.txt" -delete
查找除zz目录之外的所有文件:find . \( -path "*zz*" -prune \) -o \( -type f -print \)
find的常用参数:-name -path -maxdepth -type -mtime -size -delete
=====================
xargs擅长将标准输入数据转换成命令行参数
将多行文本转换成单行文本:
将单行输入转换成多行输出
将cat的返回值逐一传给sh脚本: cat bb | xargs -n 1 ./hanshu.sh
cat bb | xargs -I {} ./hanshu.sh {}
将cat的返回值和其他参数按顺序传给sh脚本:
cat bb | xargs -I {} ./hanshu.sh -p {} -s 【-I {} 指定了替换字符串。对于每一个命令参数,字符串{}都会被从stdin读取到的参数替换掉】
只要我们把find的输出作为xargs的输入,就必须将 -print0与find结合使用,以字符null('\0')来分隔输出 ,从而统一定界符
find . -type f -name "*.txt" -print0 | xargs - rm -f
==============
tr只能通过stdin(标准输入),而无法通过命令行参数来接受输入
ls | tr set1 set2
如果两个字符集的长度不相等,那么set2会不断重复其最后一个字符,直到长度与set1相同。如果set2的长度大于set1,那么在set2中超出set1长度的那部分
字符则全部被忽略。
======交互式的脚本==============
#!/bin/bash
myfun()
{
read -p "your name : " name;
read -p "your age : " age;
echo "hello $name,your age is $age"
if [ $age -gt 18 ]
then
echo "you are ault"
else
echo "you are too young"
read -p "your fave: " fave;
echo "you like $fave"
fi
}
myfun
==================
建立空白文件:touch aa.txt
统计文件行数:wc -l aa.sh
对目录下的文件进行搜索:grep -rn 'bash' ./ 【-r递归目录搜索,-n显示行号】
对多个文件进行搜索:grep "if" aa.sh hanshu.sh
列出匹配文件位于哪些文件中:grep -l "else" aa.sh hanshu.sh
打印出行号:grep -n "if" aa.sh
忽略大小写的搜索:grep -i "IF" aa.sh
同时搜索多个关键词:grep -e "if" -e "else" aa.sh
对于sed有多个关键词时,用一个e就行了,分号隔开:sed -e "s/111/aaa/;s/222/bbb;" sd.txt
排除某些文件进行搜搜:grep "else" . -r --exclude 'aa.sh' 排除某个目录进行搜索:grep "else" . -r --exclude-dir zz
打印匹配结果的后几行用-A,前几行用-B,前后几行用-C :例如 grep "else" . -r -B 3
替换文件中的内容:sed -i 's/you/You/g' hanshu.sh
打印第2列:ll | awk '{print $2}'
====================
tar可以将多个文件和文件夹保存为单个文件
创建压缩文件 : tar -cf tst.tar aa.sh hanshu.sh bb
列出压缩文件中的文件列表:tar -tf tst.tar 解压:tar -xf tst.tar -C zz/bb ---大写的C
gzip只能压缩单个文件或数据流,而无法对目录和多个文件进行归档。因此我们需要先创建tar归档文件,然后再用gzip进行压缩。
gzip tst.tar
gunzip tst.tar.gz
压缩率有9个等级,1~9,压缩等级越高,压缩速度越慢
=============
当然也可以用tar 直接压缩:tar -czf tst.tar.gz file1 file2 file3 解压:tar -xzf tst.tar.gz
======================
rsync -av /home/test/ /home/backups 这条命令将源目录(/home/test)中的内容(不包括目录本身)复制到现有的backups目录中
rsync -av /home/test /home/backups 这条命令将包括源目录本身(/home/test)在内的内容复制到新创建的目录backups中
如果我们在源路径末尾使用/,那么rsync会将sourch_path尾端目录中的所有内容复制到目的端。
如果没有使用/, rsync会将sourch_path尾端目录本身复制到目的端。
0 */10 * * * rsync -avz /home/code user@IP_ADDRESS:/home/backups ---每10小时执行一次,从本地同步到远端,-a表示要进行归档 ;-v表示在stdout上打印出细节信息或进度 ;z表示压缩
=============对文件逐行进行处理
myread()
{
while read line;
do
echo $line ;
done }
myread < ./aa.txt ;
===========/etc/resolv.conf的示例
domain 51osos.com //定义本地域名
search www.51osos.com 51osos.com
nameserver 202.102.192.68 //定义DNS服务器的IP地址 nameserver 202.102.192.69 //定义DNS服务器的IP地址
如果不使用DNS服务器,也可以为IP地址解析添加符号名,这只需要向文件 /etc/hosts中加入条目即可
===========
一个网络中的设备如果想同另一个网络中的设备进行通信,就需要借助某个同时连接了两个网络的设备。这个特殊的设备被称为网关
route -n 【-n指定以数字形式显示地址。如果使用-n, route会以数字形式的IP地址显示每一个条目;否则,如果IP地址具有对应的DNS条目,就会显示符号形式的主机名。】
ifconfig输出的最左边一列是网络接口名, 可以在ifconfig后加上某一个接口名,查看此接口的详细信息
============
tst()
{
for ip in 10.4..{..} ; --像{start..end}这种记法会由shell
对其进行扩展 do
echo $ip;
done
}
tst ;
=======判断是否能ping通
&> /dev/null用于将stderr和stdout重定向到 /dev/null,使对应的信息不会在终端上打印出来。
==============
MAC地址欺骗,机器重启后会失效 ifconfig eth0 hw ether 00:1c:bf:87:25:d5
获取IP地址最简单的方法就是ping给定的域名,然后查看回应信息
在远程主机中执行命令,并将命令输出显示在本地shell中,使用下面的语法:ssh user@host "command1 ; command2 ; command3"
通过FTP传输文件可以使用lftp命令,通过SSH连接传输文件可以使用sftp
只有远程主机上安装有FTP服务器才能使用FTP。
SFTP是一个类似于FTP的文件传输系统,它运行在SSH连接之上并模拟成FTP接口。它不需要远端运行FTP服务器来进行文件传输,但必须安装并运行OpenSSH服务器。
列出端口以及运行在端口上的服务:lsof -i 或者 netstat -tnp
===========
iptables -A OUTPUT -d 8.8.8.8 -j DROP
-A表明向链(chain)中添加一条新的规则,使用的是OUTPUT链,它可以对所有出站(outgoing)的流量进行控制。-d指定了所要匹配的分组目的地址。随后使用-j来使iptables丢弃(DROP)符合条件的分组。
iptables -A OUTPUT -p tcp -dport 21 -j DROP
-p指定该规则是适用于TCP, -dport指定了对应的端口
清除对iptables链所做出的所有改动:iptables --flush
==============
查看内存使用情况:free -h
========
列出文件大小:du file.txt
列出目录大小:du -a DIRECTORY
以标准单位KB、 MB或GB显示磁盘使用情况 ,加上-h 即可 :du -h QH-0.0.77.tar.gz
打印以KB为单位的文件大小: du -k FILE(s)
打印以MB为单位的文件大小: du -m FILE(s)
统计多个文件的大小,加上 -c 即可
du -ch aa.sh hanshu.sh .0K aa.sh
.0K hanshu.sh
.0K total
=================
只统计当前目录大小:du -h --max-depth 0 ./
统计当前目录及1级子目录大小:du -h --max-depth 1 ./
============== 最大的3个文件
du -ak | sort -nrk 1 |head -n 3
a所有文件; 按k单位计算大小; -n 依照数值的大小排序 ; -r 逆序; -k 1 指定按第几列排序;
[alauda@ip---- temp]$ du -ak | sort -nrk |head -n
.
./QH-0.0..tar.gz
./zz/aa.sh
==================
du提供磁盘使用情况信息,而df提供磁盘可用空间信息。 df的-h选项会以易读的格式打印磁盘空间信息。
============
统计命令执行时间:time command
上次重启时间:last reboot
用uniq去重时,要先排序再去重,如:last |awk '{print $1}' | sort | uniq
每隔2s执行一次ls命令:watch -n 3 ls ./app
===============
查看进程信息 ps -ef 或 ps -afx
========================
打印版本:uname -a
Linux cloud2 3.10.-.el7.x86_64 # SMP Thu Nov :: UTC x86_64 x86_64 x86_64 GNU/Linux
打印主机名: uname -n
cloud2
==============
编辑crontab:crontab -e
查看:crontab -l
删除:crontab -r
星号(*)指定命令应该在每个时间段执行。也就是说,如果*是写在cron作业中的小时字段中,那么命令就会每小时执行一次
在分钟字段使用*/5,可以每5分钟运行一次命令
执行cron作业所使用的权限同执行crontab命令所使用的权限相同。如果你需要执行要求更高权限的命令,例如关闭计算机,那么就要以root用户身份执行crontab。
在cron作业中指定的命令需要使用完整路径。
要在启动时运行命令,请将下面一行加入crontab: @reboot command 【如果需要以root用户的身份运行命令,需要编辑root用户的crontab。 】
==========
创建用户:useradd USER -p PASSWORD
将用户添加到组:addgroup USER GROUP
删除用户:deluser USER
修改密码:passwd USER
添加组:addgroup GROUP
删除组:delgroup GROUP
===========
监视磁盘I/O的工具就叫做iotop ,没有预装,需要自行安装
shell 学习笔记 LinuxShell脚本攻略(第2版)的更多相关文章
- LinuxShell脚本攻略--第一章 小试牛刀
使用 shell 进行数学运算: #!/bin/bash no1=; no2=; let result=no1+no2 echo $result result=$[ $no1 + no2 ] resu ...
- LinuxShell脚本攻略--第八章 当个好管家
监视磁盘的使用情况 $ du file1.txt file2.txt $ du -a file_or_dir #-a递归输出指定目录的所有文件统计 $ du file_or_dir #这只是显示子目录 ...
- LinuxShell脚本攻略--第二章 命令之乐
用 cat 进行拼接 文件查找与文件列表玩转 xargs 用 tr 进行转换排序临时文件命名与随机数分割文件和数据根据扩展名切分文件名mv 批量重命名文件交互输入自动化 cat: echo 'Text ...
- LinuxShell脚本攻略--第九章 管理重任
收集进程信息 $ ps PID TTY TIME CMD pts/ :: bash pts/ :: ps$ ps -f #-f 显示更详细的信息UID PID PPID C STIME TTY TI ...
- LinuxShell脚本攻略--第六章 B计划
tar -A或--catenate:新增文件到以存在的备份文件: -B:设置区块大小: -c或--create:建立新的备份文件: -C <目录>:这个选项用在解压缩,若要在特定目录解压缩 ...
- LinuxShell脚本攻略--第三章 以文件之名
生成任意大小的文件文件权限.所有权和粘滞位创建不可修改文件生成空白文件查找符号链接及其指向目标head 与 tail只列出目录的其他方法在命令行中用 pushd 和 popd 快速定位(cd -)统计 ...
- linux shell 脚本攻略学习20--awk命令入门详解
awk生于1977年,创始人有三个,分别为 Alfred Aho,Peter Weinberger, 和 Brian Kernighan,名称源于三个创始人的姓的首字母. 作用:处理文本文件. awk ...
- linux shell脚本攻略笔记
前一阵子系统学习了下<linux shell脚本攻略>这本书.在此记录下自己的学习笔记 1. 输出颜色字符 echo -e "\e[1:41m" 1表示背景色 2 ...
- LINUX SHELL脚本攻略笔记[速查]
Linux Shell脚本攻略笔记[速查] 资源 shell script run shell script echo printf 环境变量和变量 pgrep shell数学运算 命令状态 文件描述 ...
随机推荐
- Linux(Ubuntu)下的OpenGl的环境安装, 在qt程序中使用opengl库
OpenGl的环境安装 以下参考自:https://blog.csdn.net/wasaiheihei/article/details/52085397 1. 建立基本编译环境 首先不可或缺的,就是编 ...
- springboot的propteis的基本配置参考
其中mybatis.cfg.xml文件可以不加,这个文件最主要是开启mybatis的二级缓存:
- Tomcat中不能通过访问自己IP,但可以通过localhost/127.0.0.1访问
一.问题如下:局域网内,自己机器部署了一个tomcat应用,在本机上可以通过如下方式访问引用. http://localhost:8080/xxxx http://127.0.0.1:8080/xx ...
- Pythn基础课程笔记day03_学习内容概要及作业讲解
第三天_学习内容概要 今日内容概要 1.整形 2.布尔类型 3.字符串 内容回顾和补充 内容回顾 利用思维导图,罗列复习自己学习的内容,巩固知识点. xmind 软件 processon 网站 补充 ...
- 2019牛客暑期多校训练营(第四场)A meeting(dfs或dp,dp待更新)
示例1: 输入: 4 21 23 13 42 4 输出:2 说明: They can meet at place 1 or 3. 题意:从K个点到达不联通图某个点需要的最短时间,这个最短时间是这K个人 ...
- 文件类型分类:头文件dirent.h中定义的文件类型与linux内文件符号对应关系
头文件 dirent.h 定义了文件类型: enum{ DT_UNKNOWN = 0, //未知类型 DT_FIFO = 1, //first in, ...
- java EE学习之数据库操作
jdbc开发流程 注册驱动 建立连接(Connection) 创建运行SQL的语句(Statement) 运行语句 处理运行结果(ResultSet) 释放资源 注冊驱动有三种方式: Class.fo ...
- 天梯赛 L3-002. 堆栈
思路:这里的线段树维护一个区间里面出现数的个数,对于Pop,push单点更新一下就好. #include<stdio.h> #include<iostream> #includ ...
- Powershell学习笔记:(二)、基础知识
从Window7以后,WIndows系统都自带了Windows PowerShell. 自带版本如下 WIndow7 2.0 WIndow8 3.0 Window8.1 4.0 Win ...
- 炫酷的可视化工具包——cufflinks
前言 学过Python数据分析的朋友都知道,在可视化的工具中,有很多优秀的三方库,比如matplotlib,seaborn,plotly,Boken,pyecharts等等.这些可视化库都有自己的特点 ...