常用命令

  • sed

sed 是一种流编辑器,它是文本处理中非常常用的工具,能够完美的配合正则表达式使用,功能非常强大。

  1. mkdir playground
  2.  
  3. touch test.txt
  4.  
  5. echo "Hello world!" >> test.txt
  6.  
  7. cat>test.txt<<EOF
  8.  
  9. > i love you
  10.  
  11. > my honey
  12.  
  13. > be easy
  14.  
  15. > last row
  16.  
  17. > EOF

例如:

(1) 删除文档的第一行

  1. sed -i '1d' test.txt
  2.  
  3. cat test.txt
  1. my honey
  2. be easy
  3. last row

test.txt

(2) 删除文档的第三行

  1. sed -i '3d' test.txt
  2.  
  3. cat test.txt
  1. my honey
  2. be easy

test.txt

(3) 删除文档的最后一行

  1. sed -i '$d' test.txt
  2.  
  3. cat test.txt
  1. my honey

test.txt

  • dpkg

dpkg是Debian package的简写,是为Debian操作系统专门开发的套件管理系统,用于软件的安装、更新和移除。所有源自 Debian 的 Linux 发行版都使用dpkg,最常见的如 Ubuntu。

(1) 软件安装

  1. cv@cv: ~$ sudo dpkg -i file.deb

其中file.deb是提前手动下载下来的安装包。

有时候安装某个软件时会需要环境中其他依赖项的配置,使用 -f 命令让系统自动去处理依赖项问题。

  1. cv@cv: ~$ sudo apt-get install -f

(2) 软件卸载

  1. cv@cv: ~$ sudo dpkg -l | grep chrome

卸载之前一般先查看软件版本等的信息,-l命令用于显示包的版本

  1. cv@cv: ~$ sudo dpkg -r file.deb

移除软件,但保留配置,如果想要不保留配置,使用-P命令

  1. cv@cv: ~$ sudo dpkg -P file.deb
  • uname

该命令用来查看操作系统的详细信息。用法如下

  1. uname [OPTION]...

当没有给定参数时,默认输出 uname -s 的结果,只显示内核名称。

参数解释如下:

  1. -a  按下面参数出现的顺序输出所有信息,如果处理器和硬件平台信息未知则略去-p和-i的结果
  2. -s  输出内核名称
  3. -n  输出网络主机的名称
  4. -r  输出当前系统的内核发行版本
  5. -v  输出内核版本信息
  6. -m  输出机器硬件名称
  7. -p  输出处理器型号
  8. -i  输出硬件平台的信息
  9. -o  输出操作系统的信息
  10. --help  展示帮助信息并退出
  1. cv@cv: ~$ uname -a
  2. Linux # kernel-name
  3. cv # nodename
  4. 4.15.--generic # kernel-release
  5. #~16.04.-Ubuntu SMP Fri Apr :: UTC # kernel-version
  6. x86_64 # machine
  7. x86_64 # processor
  8. x86_64 # hardware-platform
  9. GNU/Linux # operating-system
  • tree

用来显示指定文件夹的目录结构,以便我们迅速了解该文件夹下由那些文件/文件夹构成。

(1) 不加任何参数时,默认显示当前文件夹的所有文件及其结构

  1. cv@cv: ~$ tree
  1. .
  2. ├── build
  3. ├── block.png
  4. ├── chessboard.png
  5. ├── CMakeCache.txt
  6. ├── CMakeFiles
  7. ├── 3.5.
  8. ├── CMakeCCompiler.cmake
  9. ├── CMakeCXXCompiler.cmake
  10. ├── CMakeDetermineCompilerABI_C.bin
  11. ├── CMakeDetermineCompilerABI_CXX.bin
  12. ├── CMakeSystem.cmake
  13. ├── CompilerIdC
  14. ├── a.out
  15. └── CMakeCCompilerId.c
  16. └── CompilerIdCXX
  17. ├── a.out
  18. └── CMakeCXXCompilerId.cpp
  19. ├── cmake.check_cache
  20. ├── CMakeDirectoryInformation.cmake
  21. ├── CMakeOutput.log
  22. ├── CMakeTmp
  23. ├── feature_tests.bin
  24. ├── feature_tests.c
  25. ├── feature_tests.cxx
  26. ├── Makefile2
  27. ├── Makefile.cmake
  28. ├── progress.marks
  29. ├── raytrace.dir
  30. ├── build.make
  31. ├── cmake_clean.cmake
  32. ├── CXX.includecache
  33. ├── DependInfo.cmake
  34. ├── depend.internal
  35. ├── depend.make
  36. ├── flags.make
  37. ├── link.txt
  38. ├── lodepng
  39. └── lodepng.cpp.o
  40. ├── progress.make
  41. └── raytrace
  42. ├── algebra.cpp.o
  43. ├── binary.cpp.o
  44. ├── chessboard.cpp.o
  45. ├── cuboid.cpp.o
  46. ├── cylinder.cpp.o
  47. ├── debug.cpp.o
  48. ├── dodecahedron.cpp.o
  49. ├── icosahedron.cpp.o
  50. ├── main.cpp.o
  51. ├── optics.cpp.o
  52. ├── planet.cpp.o
  53. ├── reorient.cpp.o
  54. ├── scene.cpp.o
  55. ├── setcompl.cpp.o
  56. ├── setisect.cpp.o
  57.  
  58. ├── setunion.cpp.o [/]
  59. ├── solid.cpp.o
  60. ├── sphere.cpp.o
  61. ├── spheroid.cpp.o
  62. ├── thinring.cpp.o
  63. ├── torus.cpp.o
  64. └── triangle.cpp.o
  65. └── TargetDirectories.txt
  66. ├── cmake_install.cmake
  67. ├── cuboid.png
  68. ├── cylinder.png
  69. ├── difference.png
  70. ├── donutbite.png
  71. ├── intersection.png
  72. ├── Makefile
  73. ├── multisphere.png
  74. ├── overlap.png
  75. ├── polyhedra.png
  76. ├── raytrace
  77. ├── saturn.png
  78. ├── sphere.png
  79. ├── spheroid.png
  80. ├── torus1.png
  81. └── torus2.png
  82. ├── CMakeLists.txt
  83. ├── lodepng
  84. ├── lodepng.cpp
  85. └── lodepng.h
  86. └── raytrace
  87. ├── algebra.cpp
  88. ├── algebra.h
  89. ├── binary.cpp
  90. ├── block.h
  91. ├── chessboard.cpp
  92. ├── chessboard.h
  93. ├── cuboid.cpp
  94. ├── cylinder.cpp
  95. ├── debug.cpp
  96. ├── dodecahedron.cpp
  97. ├── icosahedron.cpp
  98. ├── imager.h
  99. ├── main.cpp
  100. ├── optics.cpp
  101. ├── planet.cpp
  102. ├── planet.h
  103. ├── polyhedra.h
  104. ├── raytrace.vcproj
  105. ├── reorient.cpp
  106. ├── scene.cpp
  107. ├── setcompl.cpp
  108. ├── setisect.cpp
  109. ├── setunion.cpp
  110. ├── solid.cpp
  111. ├── sphere.cpp
  112. ├── spheroid.cpp
  113. ├── thinring.cpp
  114. ├── torus.cpp
  115. └── triangle.cpp
  116.  
  117. directories, files

tree

(2) 利用-L参数,显示到Level 2即停止,不会全部显示出来,方便我们宏观把握

  1. cv@cv: ~$ tree -L
  1. .
  2.  
  3. ├── build
  4. ├── block.png
  5. ├── chessboard.png
  6. ├── CMakeCache.txt
  7. ├── CMakeFiles
  8. ├── cmake_install.cmake
  9. ├── cuboid.png
  10. ├── cylinder.png
  11. ├── difference.png
  12. ├── donutbite.png
  13. ├── intersection.png
  14. ├── Makefile
  15. ├── multisphere.png
  16. ├── overlap.png
  17. ├── polyhedra.png
  18. ├── raytrace
  19. ├── saturn.png
  20. ├── sphere.png
  21. ├── spheroid.png
  22. ├── torus1.png
  23. └── torus2.png
  24. ├── CMakeLists.txt
  25. ├── lodepng
  26. ├── lodepng.cpp
  27. └── lodepng.h
  28. └── raytrace
  29. ├── algebra.cpp
  30. ├── algebra.h
  31. ├── binary.cpp
  32. ├── block.h
  33. ├── chessboard.cpp
  34. ├── chessboard.h
  35. ├── cuboid.cpp
  36. ├── cylinder.cpp
  37. ├── debug.cpp
  38. ├── dodecahedron.cpp
  39. ├── icosahedron.cpp
  40. ├── imager.h
  41. ├── main.cpp
  42. ├── optics.cpp
  43. ├── planet.cpp
  44. ├── planet.h
  45. ├── polyhedra.h
  46. ├── raytrace.vcproj
  47. ├── reorient.cpp
  48. ├── scene.cpp
  49. ├── setcompl.cpp
  50. ├── setisect.cpp
  51. ├── setunion.cpp
  52. ├── solid.cpp
  53. ├── sphere.cpp
  54. ├── spheroid.cpp
  55. ├── thinring.cpp
  56. ├── torus.cpp
  57. └── triangle.cpp
  58.  
  59. directories, files

tree -L 2

(3) 利用-I参数指定忽略某个文件夹,因为有时候我们明确知道不需要显示该文件包含的文件和结构

  1. cv@cv: ~$ tree -I build
  1. .
  2. ├── CMakeLists.txt
  3. ├── lodepng
  4. ├── lodepng.cpp
  5. └── lodepng.h
  6. └── raytrace
  7. ├── algebra.cpp
  8. ├── algebra.h
  9. ├── binary.cpp
  10. ├── block.h
  11. ├── chessboard.cpp
  12. ├── chessboard.h
  13. ├── cuboid.cpp
  14. ├── cylinder.cpp
  15. ├── debug.cpp
  16. ├── dodecahedron.cpp
  17. ├── icosahedron.cpp
  18. ├── imager.h
  19. ├── main.cpp
  20. ├── optics.cpp
  21. ├── planet.cpp
  22. ├── planet.h
  23. ├── polyhedra.h
  24. ├── raytrace.vcproj
  25. ├── reorient.cpp
  26. ├── scene.cpp
  27. ├── setcompl.cpp
  28. ├── setisect.cpp
  29. ├── setunion.cpp
  30. ├── solid.cpp
  31. ├── sphere.cpp
  32. ├── spheroid.cpp
  33. ├── thinring.cpp
  34. ├── torus.cpp
  35. └── triangle.cpp
  36.  
  37. directories, files

tree -I build

如果需要忽略多个文件夹,多个文件夹之间使用分隔符 "|" 隔离开,并将要忽略的文件名字符串用单引号引起来,如下所示

  1. cv@cv: ~$ tree -I 'build|cmake_build_debug'

===================================================分割线===================================================

常见问题及解决方案

  • SWAP分区的手动刷新

SWAP 分区是 Linux 系统的交换分区,一般在安装系统时建立。

Memory指机器物理内存,读写速度比 CPU 低一个量级,但比磁盘高了不止一个量级。因此程序和数据如果在内存中的话,会有非常快的读写速度。但内存造价高于磁盘,且内存在断电时会丢失数据也是不能把所有数据和程序都保存在内存中的原因。既然不能全部使用内存,那数据还有程序不可能一直霸占内存。当内存空间不足时,就必须要把内存中不经常运行的程序踢出去。

SWAP 全称swap place,即交换分区。当内存不够时,被踢出的进程被暂时存储到交换区,以便让系统不会因内存不够而导致oom或者其他更致命的情况。当需要这条被踢出的进程时,就从交换区重新加载到内存,否则它不会主动交换到真实内存中。

根据Centos官网介绍,SWAP的大小可以按如下公式确定

  1. 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 命令查看当前系统上正在使用的交换空间有哪些,以及相关信息。

  1. cv@cv: ~$ swapon -s
  2. Filename Type Size Used Priority
  3. /dev/sdb8 partition -

当 SWAP占用率较高时,对系统性能可能会有一定的影响,所以在适当情况下,我们需要手动刷新,将 SWAP里的数据转储回内存,并清空SWAP里的数据。

其原理非常简单,就是把 SWAP 关闭再重启。

  1. cv@cv: ~$ sudo swapoff -a && sudo swapon -a
  • sudo apt update的问题

update时出现下面的提示

  1. E: Could not get lock /var/lib/apt/lists/lock - open (: Resource temporarily unavailable)
  2. E: Unable to lock directory /var/lib/apt/lists/

解决方法

方法1:找出所有占用 apt 的进程

  1. cv@cv: ~$ ps -A | grep apt

终止这些占用进程

  1. cv@cv: ~$ sudo kill - processnumber

之后再 update 即可。

方法2:删除被锁定文件

  1. cv@cv: ~$ sudo rm /var/cache/apt/archives/lock
  1. cv@cv: ~$ sudo rm /var/lib/dpkg/lock

强制重置配置软件包

  1. cv@cv: ~$ sudo dpkg --configure -a

之后再 update 即可。

  • CLI运行脚本出现syntax error: unexpected end of file

通常我们在编辑 Linux 服务器上的文件时,直接在 Linux 环境比较麻烦(当然熟练使用 VIM 的程序员除外哈哈),有时我们会使用 Windows 将文件编辑好再上传到服务器端,我这里用的是 Sublime text 。

编辑完脚本上传到服务器运行时,会出现语法错误,以下面的一小段脚本为例

  1. #!/bin/bash
  2. echo "updatedb..."
  3. sudo updatedb
  4.  
  5. BASE_PATH=$(dirname $(locate $))
  6. echo ${BASE_PATH}
  7.  
  8. if [ $BASE_PATH == "TODO" ]
  9. then
  10. echo "please modify this script with the base path of your bundler installation";
  11. exit;
  12. fi
  13.  
  14. EXTRACT_FOCAL=${BASE_PATH}/bin/extract_focal.pl
  15. echo ${EXTRACT_FOCAL}
  16.  
  17. echo "[- Done -]"
  1. cv@cv: ~/bundler$ bash runbundler.sh
  2. runbundler.sh: line : $'\r': command not found
  3. runbundler.sh: line : $'\r': command not found
  4. runbundler.sh: line : $'\r': command not found
  5. runbundler.sh: line : $'\r': command not found
  6. 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 来实现

  1. ~$ python
  2.  
  3. >> import os
  4.  
  5. >> 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的更多相关文章

  1. Linux学习笔记-Linux系统简介

    Linux学习笔记-Linux系统简介 UNIX与Linux发展史 UNIX是父亲,Linux是儿子. UNIX发行版本 操作系统 公司 硬件平台 AIX IBM PowerPC HP-UX HP P ...

  2. Linux内核分析第七周学习笔记——Linux内核如何装载和启动一个可执行程序

    Linux内核分析第七周学习笔记--Linux内核如何装载和启动一个可执行程序 zl + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study. ...

  3. Linux bash script regex auto replace

    Linux bash script regex auto replace 自动替换 /assets/css/0.styles.96df394b.css => ./assets/css/0.sty ...

  4. Linux Bash Script conditions

    Linux Bash Script conditions shell 编程之条件判断 条件判断式语句.单分支 if 语句.双分支 if 语句.多分支 if 语句.case 语句 refs http:/ ...

  5. Linux Bash Script loop

    Linux Bash Script loop shell 编程之流程控制 for 循环.while 循环和 until 循环 for var in item1 item2 ... itemN do c ...

  6. 大数据学习笔记——Linux基本知识及指令(理论部分)

    Linux学习笔记整理 上一篇博客中,我们详细地整理了如何从0部署一套Linux操作系统,那么这一篇就承接上篇文章,我们仔细地把Linux的一些基础知识以及常用指令(包括一小部分高级命令)做一个梳理, ...

  7. Linux: bash script

    content [toc] bash scripts equivalent bash command to rename a bash variable/command alias fire='fir ...

  8. 《马哥出品高薪linux运维教程》wingkeung学习笔记-linux基础入门课程

    计算机原理概念: 1.CPU和内存中的存储单元通信线路称为总线(BUS),总线是被指令和数据复用的,所以也称为前端总线. 2.计算机中计算频率的时间标准即晶体振荡器原理,精确计算时间长度,根据相同的时 ...

  9. 【Linux学习 】Linux使用Script命令来记录并回放终端会话

    一背景 二script命令简介 1 什么script命令 2 script命令操作 21 file选项 22 options选项 23 退出script 三Script命令结合实际使用场景 1 先在终 ...

随机推荐

  1. json、JSONObject、JSONArray的应用

    type.java package jiekou.duixiang; import java.text.ParseException;import java.text.SimpleDateFormat ...

  2. flex 分页

    <?xml version="1.0" encoding="utf-8"?><s:Group xmlns:fx="http://ns ...

  3. 批处理(bat)的注释方法

    前面两个批处理教程的转贴,写得实在是太好了,内容详实,语言风趣,举例清晰.说实话,原作者幽默的文风用来写 批处理教程,而不是写文学小说,实在是有些屈才,但这样优秀的教程,用在枯燥乏味的程序事业里,确实 ...

  4. 20155223 2016-2017-2 《Java程序设计》第9周学习总结

    20155223 2016-2017-2 <Java程序设计>第9周学习总结 教材学习内容总结 第十六章 JDBC--Java数据库连接是用于执行SQL的解决方案,开发人员无需接触底层数据 ...

  5. 配置好Nginx后,通过flume收集日志到hdfs(记得生成本地log时,不要生成一个文件,)

    生成本地log最好生成多个文件放在一个文件夹里,特别多的时候一个小时一个文件 配置好Nginx后,通过flume收集日志到hdfs 可参考flume的文件 用flume的案例二 执行的注意点 avro ...

  6. hdu 5066 小球碰撞(物理题)

    http://acm.hdu.edu.cn/showproblem.php?pid=5066 中学物理题 #include <cstdio> #include <cstdlib> ...

  7. C++实现wc.exe程序

    github项目地址:https://github.com/insomniali/wc 基本功能 wc.exe -c file     统计文件file的字符数  [实现] wc.exe -w fil ...

  8. 常用kubectl命令总结

    command kubectl kubectl 输出格式 显示Pod的更多信息 kubectl get pod <pod-name> -o wide 以yaml格式显示Pod的详细信息 k ...

  9. Visual Studio 6 (VC6)连接Team Foundation Server (TFS 2018),实现源代码的版本管理

    1. 概述 Visual Studio 6(VB6, VC6, Foxpro-)是微软公司在1998年推出的一款基于Windows平台的软件开发工具,也是微软推出.NET开发框架之前的最后一个IDE工 ...

  10. linux系统编程之进程(一):进程与程序

    本节目标: 什么是程序 什么是进程 进程数据结构 进程与程序区别与联系 一,什么是程序? 程序是完成特定任务的一系列指令集合 二,什么是进程? 从用户的角度来看进程是程序的一次动态执行过程 从操作系统 ...