【学习笔记】linux bash script
常用命令
- sed
sed 是一种流编辑器,它是文本处理中非常常用的工具,能够完美的配合正则表达式使用,功能非常强大。
- mkdir playground
- touch test.txt
- echo "Hello world!" >> test.txt
- cat>test.txt<<EOF
- > i love you
- > my honey
- > be easy
- > last row
- > EOF
例如:
(1) 删除文档的第一行
- sed -i '1d' test.txt
- cat test.txt
- my honey
- be easy
- last row
test.txt
(2) 删除文档的第三行
- sed -i '3d' test.txt
- cat test.txt
- my honey
- be easy
test.txt
(3) 删除文档的最后一行
- sed -i '$d' test.txt
- cat test.txt
- my honey
test.txt
- dpkg
dpkg是Debian package的简写,是为Debian操作系统专门开发的套件管理系统,用于软件的安装、更新和移除。所有源自 Debian 的 Linux 发行版都使用dpkg,最常见的如 Ubuntu。
(1) 软件安装
- cv@cv: ~$ sudo dpkg -i file.deb
其中file.deb是提前手动下载下来的安装包。
有时候安装某个软件时会需要环境中其他依赖项的配置,使用 -f 命令让系统自动去处理依赖项问题。
- cv@cv: ~$ sudo apt-get install -f
(2) 软件卸载
- cv@cv: ~$ sudo dpkg -l | grep chrome
卸载之前一般先查看软件版本等的信息,-l命令用于显示包的版本
- cv@cv: ~$ sudo dpkg -r file.deb
移除软件,但保留配置,如果想要不保留配置,使用-P命令
- cv@cv: ~$ sudo dpkg -P file.deb
- uname
该命令用来查看操作系统的详细信息。用法如下
- uname [OPTION]...
当没有给定参数时,默认输出 uname -s 的结果,只显示内核名称。
参数解释如下:
- -a 按下面参数出现的顺序输出所有信息,如果处理器和硬件平台信息未知则略去-p和-i的结果
- -s 输出内核名称
- -n 输出网络主机的名称
- -r 输出当前系统的内核发行版本
- -v 输出内核版本信息
- -m 输出机器硬件名称
- -p 输出处理器型号
- -i 输出硬件平台的信息
- -o 输出操作系统的信息
- --help 展示帮助信息并退出
- cv@cv: ~$ uname -a
- Linux # kernel-name
- cv # nodename
- 4.15.--generic # kernel-release
- #~16.04.-Ubuntu SMP Fri Apr :: UTC # kernel-version
- x86_64 # machine
- x86_64 # processor
- x86_64 # hardware-platform
- GNU/Linux # operating-system
- tree
用来显示指定文件夹的目录结构,以便我们迅速了解该文件夹下由那些文件/文件夹构成。
(1) 不加任何参数时,默认显示当前文件夹的所有文件及其结构
- cv@cv: ~$ tree
- .
- ├── build
- │ ├── block.png
- │ ├── chessboard.png
- │ ├── CMakeCache.txt
- │ ├── CMakeFiles
- │ │ ├── 3.5.
- │ │ │ ├── CMakeCCompiler.cmake
- │ │ │ ├── CMakeCXXCompiler.cmake
- │ │ │ ├── CMakeDetermineCompilerABI_C.bin
- │ │ │ ├── CMakeDetermineCompilerABI_CXX.bin
- │ │ │ ├── CMakeSystem.cmake
- │ │ │ ├── CompilerIdC
- │ │ │ │ ├── a.out
- │ │ │ │ └── CMakeCCompilerId.c
- │ │ │ └── CompilerIdCXX
- │ │ │ ├── a.out
- │ │ │ └── CMakeCXXCompilerId.cpp
- │ │ ├── cmake.check_cache
- │ │ ├── CMakeDirectoryInformation.cmake
- │ │ ├── CMakeOutput.log
- │ │ ├── CMakeTmp
- │ │ ├── feature_tests.bin
- │ │ ├── feature_tests.c
- │ │ ├── feature_tests.cxx
- │ │ ├── Makefile2
- │ │ ├── Makefile.cmake
- │ │ ├── progress.marks
- │ │ ├── raytrace.dir
- │ │ │ ├── build.make
- │ │ │ ├── cmake_clean.cmake
- │ │ │ ├── CXX.includecache
- │ │ │ ├── DependInfo.cmake
- │ │ │ ├── depend.internal
- │ │ │ ├── depend.make
- │ │ │ ├── flags.make
- │ │ │ ├── link.txt
- │ │ │ ├── lodepng
- │ │ │ │ └── lodepng.cpp.o
- │ │ │ ├── progress.make
- │ │ │ └── raytrace
- │ │ │ ├── algebra.cpp.o
- │ │ │ ├── binary.cpp.o
- │ │ │ ├── chessboard.cpp.o
- │ │ │ ├── cuboid.cpp.o
- │ │ │ ├── cylinder.cpp.o
- │ │ │ ├── debug.cpp.o
- │ │ │ ├── dodecahedron.cpp.o
- │ │ │ ├── icosahedron.cpp.o
- │ │ │ ├── main.cpp.o
- │ │ │ ├── optics.cpp.o
- │ │ │ ├── planet.cpp.o
- │ │ │ ├── reorient.cpp.o
- │ │ │ ├── scene.cpp.o
- │ │ │ ├── setcompl.cpp.o
- │ │ │ ├── setisect.cpp.o
- │ │ │ ├── setunion.cpp.o [/]
- │ │ │ ├── solid.cpp.o
- │ │ │ ├── sphere.cpp.o
- │ │ │ ├── spheroid.cpp.o
- │ │ │ ├── thinring.cpp.o
- │ │ │ ├── torus.cpp.o
- │ │ │ └── triangle.cpp.o
- │ │ └── TargetDirectories.txt
- │ ├── cmake_install.cmake
- │ ├── cuboid.png
- │ ├── cylinder.png
- │ ├── difference.png
- │ ├── donutbite.png
- │ ├── intersection.png
- │ ├── Makefile
- │ ├── multisphere.png
- │ ├── overlap.png
- │ ├── polyhedra.png
- │ ├── raytrace
- │ ├── saturn.png
- │ ├── sphere.png
- │ ├── spheroid.png
- │ ├── torus1.png
- │ └── torus2.png
- ├── CMakeLists.txt
- ├── lodepng
- │ ├── lodepng.cpp
- │ └── lodepng.h
- └── raytrace
- ├── algebra.cpp
- ├── algebra.h
- ├── binary.cpp
- ├── block.h
- ├── chessboard.cpp
- ├── chessboard.h
- ├── cuboid.cpp
- ├── cylinder.cpp
- ├── debug.cpp
- ├── dodecahedron.cpp
- ├── icosahedron.cpp
- ├── imager.h
- ├── main.cpp
- ├── optics.cpp
- ├── planet.cpp
- ├── planet.h
- ├── polyhedra.h
- ├── raytrace.vcproj
- ├── reorient.cpp
- ├── scene.cpp
- ├── setcompl.cpp
- ├── setisect.cpp
- ├── setunion.cpp
- ├── solid.cpp
- ├── sphere.cpp
- ├── spheroid.cpp
- ├── thinring.cpp
- ├── torus.cpp
- └── triangle.cpp
- directories, files
tree
(2) 利用-L参数,显示到Level 2即停止,不会全部显示出来,方便我们宏观把握
- cv@cv: ~$ tree -L
- .
- ├── build
- │ ├── block.png
- │ ├── chessboard.png
- │ ├── CMakeCache.txt
- │ ├── CMakeFiles
- │ ├── cmake_install.cmake
- │ ├── cuboid.png
- │ ├── cylinder.png
- │ ├── difference.png
- │ ├── donutbite.png
- │ ├── intersection.png
- │ ├── Makefile
- │ ├── multisphere.png
- │ ├── overlap.png
- │ ├── polyhedra.png
- │ ├── raytrace
- │ ├── saturn.png
- │ ├── sphere.png
- │ ├── spheroid.png
- │ ├── torus1.png
- │ └── torus2.png
- ├── CMakeLists.txt
- ├── lodepng
- │ ├── lodepng.cpp
- │ └── lodepng.h
- └── raytrace
- ├── algebra.cpp
- ├── algebra.h
- ├── binary.cpp
- ├── block.h
- ├── chessboard.cpp
- ├── chessboard.h
- ├── cuboid.cpp
- ├── cylinder.cpp
- ├── debug.cpp
- ├── dodecahedron.cpp
- ├── icosahedron.cpp
- ├── imager.h
- ├── main.cpp
- ├── optics.cpp
- ├── planet.cpp
- ├── planet.h
- ├── polyhedra.h
- ├── raytrace.vcproj
- ├── reorient.cpp
- ├── scene.cpp
- ├── setcompl.cpp
- ├── setisect.cpp
- ├── setunion.cpp
- ├── solid.cpp
- ├── sphere.cpp
- ├── spheroid.cpp
- ├── thinring.cpp
- ├── torus.cpp
- └── triangle.cpp
- directories, files
tree -L 2
(3) 利用-I参数指定忽略某个文件夹,因为有时候我们明确知道不需要显示该文件包含的文件和结构
- cv@cv: ~$ tree -I build
- .
- ├── CMakeLists.txt
- ├── lodepng
- │ ├── lodepng.cpp
- │ └── lodepng.h
- └── raytrace
- ├── algebra.cpp
- ├── algebra.h
- ├── binary.cpp
- ├── block.h
- ├── chessboard.cpp
- ├── chessboard.h
- ├── cuboid.cpp
- ├── cylinder.cpp
- ├── debug.cpp
- ├── dodecahedron.cpp
- ├── icosahedron.cpp
- ├── imager.h
- ├── main.cpp
- ├── optics.cpp
- ├── planet.cpp
- ├── planet.h
- ├── polyhedra.h
- ├── raytrace.vcproj
- ├── reorient.cpp
- ├── scene.cpp
- ├── setcompl.cpp
- ├── setisect.cpp
- ├── setunion.cpp
- ├── solid.cpp
- ├── sphere.cpp
- ├── spheroid.cpp
- ├── thinring.cpp
- ├── torus.cpp
- └── triangle.cpp
- directories, files
tree -I build
如果需要忽略多个文件夹,多个文件夹之间使用分隔符 "|" 隔离开,并将要忽略的文件名字符串用单引号引起来,如下所示
- cv@cv: ~$ tree -I 'build|cmake_build_debug'
===================================================分割线===================================================
常见问题及解决方案
- SWAP分区的手动刷新
SWAP 分区是 Linux 系统的交换分区,一般在安装系统时建立。
Memory指机器物理内存,读写速度比 CPU 低一个量级,但比磁盘高了不止一个量级。因此程序和数据如果在内存中的话,会有非常快的读写速度。但内存造价高于磁盘,且内存在断电时会丢失数据也是不能把所有数据和程序都保存在内存中的原因。既然不能全部使用内存,那数据还有程序不可能一直霸占内存。当内存空间不足时,就必须要把内存中不经常运行的程序踢出去。
SWAP 全称swap place,即交换分区。当内存不够时,被踢出的进程被暂时存储到交换区,以便让系统不会因内存不够而导致oom或者其他更致命的情况。当需要这条被踢出的进程时,就从交换区重新加载到内存,否则它不会主动交换到真实内存中。
根据Centos官网介绍,SWAP的大小可以按如下公式确定
- M = Amount of RAM in GB, and S = Amount of swap in GB, then If M < , S = M * Else S = M +
但有时服务器访问量确实很大,有可能出现 SWAP 分区不够用的情况,需要手动构建,这是后话。
在 Linux上可使用 swapon -s 命令查看当前系统上正在使用的交换空间有哪些,以及相关信息。
- cv@cv: ~$ swapon -s
- Filename Type Size Used Priority
- /dev/sdb8 partition -
当 SWAP占用率较高时,对系统性能可能会有一定的影响,所以在适当情况下,我们需要手动刷新,将 SWAP里的数据转储回内存,并清空SWAP里的数据。
其原理非常简单,就是把 SWAP 关闭再重启。
- cv@cv: ~$ sudo swapoff -a && sudo swapon -a
- sudo apt update的问题
update时出现下面的提示
- E: Could not get lock /var/lib/apt/lists/lock - open (: Resource temporarily unavailable)
- E: Unable to lock directory /var/lib/apt/lists/
解决方法
方法1:找出所有占用 apt 的进程
- cv@cv: ~$ ps -A | grep apt
终止这些占用进程
- cv@cv: ~$ sudo kill - processnumber
之后再 update 即可。
方法2:删除被锁定文件
- cv@cv: ~$ sudo rm /var/cache/apt/archives/lock
- cv@cv: ~$ sudo rm /var/lib/dpkg/lock
强制重置配置软件包
- cv@cv: ~$ sudo dpkg --configure -a
之后再 update 即可。
- CLI运行脚本出现syntax error: unexpected end of file
通常我们在编辑 Linux 服务器上的文件时,直接在 Linux 环境比较麻烦(当然熟练使用 VIM 的程序员除外哈哈),有时我们会使用 Windows 将文件编辑好再上传到服务器端,我这里用的是 Sublime text 。
编辑完脚本上传到服务器运行时,会出现语法错误,以下面的一小段脚本为例
- #!/bin/bash
- echo "updatedb..."
- sudo updatedb
- BASE_PATH=$(dirname $(locate $))
- echo ${BASE_PATH}
- if [ $BASE_PATH == "TODO" ]
- then
- echo "please modify this script with the base path of your bundler installation";
- exit;
- fi
- EXTRACT_FOCAL=${BASE_PATH}/bin/extract_focal.pl
- echo ${EXTRACT_FOCAL}
- echo "[- Done -]"
- cv@cv: ~/bundler$ bash runbundler.sh
- runbundler.sh: line : $'\r': command not found
- runbundler.sh: line : $'\r': command not found
- runbundler.sh: line : $'\r': command not found
- runbundler.sh: line : $'\r': command not found
- runbundler.sh: line : syntax error: unexpected end of file
这里显示的两个问题都是因为我们的 .sh 文件为 dos 格式,在 dos/windows 系统中按一次回车键实际上输入的是 CRLF ,即回车+换行。
而 Linux 系统一般只能执行 unix 格式的脚本,在 Linux/Unix 系统中按一次回车键实际上输入的是 LF ,即只有换行。
所以这里在 Windows 系统编辑的 sh 脚本文件每行都多了一个回车,当在 Linux 系统中运行时就会报错提示找不到相关命令。
我们可以查看该脚本的格式,在命令行使用 vim 打开脚本, ESC 进入命令输入模式,输入 :set ff ,查看输出结果,比如我得到的是 fileformat=dos
此时我们可以使用 :set ff=unix 将 dos 格式更改为 unix 格式, ff=fileformat ,因此也可以输入 :set fileformat=unix ,这是 :set ff 查看会得到修改后的结果 fileformat=unix
然后再执行脚本就不会出现上面的错误了!
- 文本格式转换之 docx-to-pdf
利用 Liunx 下的 LibreOffice 来实现
- ~$ python
- >> import os
- >> os.system(“libreoffice --invisible --convert-to pdf --outdir /home/cv/Documents/myfiles/ /home/cv/Documents/myfiles/source.docx”)
注意:
1. 转换时要保证 libreoffice 没有被打开
2. 通过命令行调用 liberoffer 时需要注意中文不显示、中文乱码等问题,具体参考博客https://blog.csdn.net/zapperstab/article/details/18602969
未完待续……
Reference
[1] 解决执行脚本报syntax error: unexpected end of file或syntax error near unexpected token `fi'错误的问题
[2] linux下docx转pdf
【学习笔记】linux bash script的更多相关文章
- Linux学习笔记-Linux系统简介
Linux学习笔记-Linux系统简介 UNIX与Linux发展史 UNIX是父亲,Linux是儿子. UNIX发行版本 操作系统 公司 硬件平台 AIX IBM PowerPC HP-UX HP P ...
- Linux内核分析第七周学习笔记——Linux内核如何装载和启动一个可执行程序
Linux内核分析第七周学习笔记--Linux内核如何装载和启动一个可执行程序 zl + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study. ...
- Linux bash script regex auto replace
Linux bash script regex auto replace 自动替换 /assets/css/0.styles.96df394b.css => ./assets/css/0.sty ...
- Linux Bash Script conditions
Linux Bash Script conditions shell 编程之条件判断 条件判断式语句.单分支 if 语句.双分支 if 语句.多分支 if 语句.case 语句 refs http:/ ...
- Linux Bash Script loop
Linux Bash Script loop shell 编程之流程控制 for 循环.while 循环和 until 循环 for var in item1 item2 ... itemN do c ...
- 大数据学习笔记——Linux基本知识及指令(理论部分)
Linux学习笔记整理 上一篇博客中,我们详细地整理了如何从0部署一套Linux操作系统,那么这一篇就承接上篇文章,我们仔细地把Linux的一些基础知识以及常用指令(包括一小部分高级命令)做一个梳理, ...
- Linux: bash script
content [toc] bash scripts equivalent bash command to rename a bash variable/command alias fire='fir ...
- 《马哥出品高薪linux运维教程》wingkeung学习笔记-linux基础入门课程
计算机原理概念: 1.CPU和内存中的存储单元通信线路称为总线(BUS),总线是被指令和数据复用的,所以也称为前端总线. 2.计算机中计算频率的时间标准即晶体振荡器原理,精确计算时间长度,根据相同的时 ...
- 【Linux学习 】Linux使用Script命令来记录并回放终端会话
一背景 二script命令简介 1 什么script命令 2 script命令操作 21 file选项 22 options选项 23 退出script 三Script命令结合实际使用场景 1 先在终 ...
随机推荐
- json、JSONObject、JSONArray的应用
type.java package jiekou.duixiang; import java.text.ParseException;import java.text.SimpleDateFormat ...
- flex 分页
<?xml version="1.0" encoding="utf-8"?><s:Group xmlns:fx="http://ns ...
- 批处理(bat)的注释方法
前面两个批处理教程的转贴,写得实在是太好了,内容详实,语言风趣,举例清晰.说实话,原作者幽默的文风用来写 批处理教程,而不是写文学小说,实在是有些屈才,但这样优秀的教程,用在枯燥乏味的程序事业里,确实 ...
- 20155223 2016-2017-2 《Java程序设计》第9周学习总结
20155223 2016-2017-2 <Java程序设计>第9周学习总结 教材学习内容总结 第十六章 JDBC--Java数据库连接是用于执行SQL的解决方案,开发人员无需接触底层数据 ...
- 配置好Nginx后,通过flume收集日志到hdfs(记得生成本地log时,不要生成一个文件,)
生成本地log最好生成多个文件放在一个文件夹里,特别多的时候一个小时一个文件 配置好Nginx后,通过flume收集日志到hdfs 可参考flume的文件 用flume的案例二 执行的注意点 avro ...
- hdu 5066 小球碰撞(物理题)
http://acm.hdu.edu.cn/showproblem.php?pid=5066 中学物理题 #include <cstdio> #include <cstdlib> ...
- C++实现wc.exe程序
github项目地址:https://github.com/insomniali/wc 基本功能 wc.exe -c file 统计文件file的字符数 [实现] wc.exe -w fil ...
- 常用kubectl命令总结
command kubectl kubectl 输出格式 显示Pod的更多信息 kubectl get pod <pod-name> -o wide 以yaml格式显示Pod的详细信息 k ...
- Visual Studio 6 (VC6)连接Team Foundation Server (TFS 2018),实现源代码的版本管理
1. 概述 Visual Studio 6(VB6, VC6, Foxpro-)是微软公司在1998年推出的一款基于Windows平台的软件开发工具,也是微软推出.NET开发框架之前的最后一个IDE工 ...
- linux系统编程之进程(一):进程与程序
本节目标: 什么是程序 什么是进程 进程数据结构 进程与程序区别与联系 一,什么是程序? 程序是完成特定任务的一系列指令集合 二,什么是进程? 从用户的角度来看进程是程序的一次动态执行过程 从操作系统 ...