Linux系统常用命令以及常见问题的解决方法
常用命令
- sed
sed?是一種流編輯器,它是文本處理中非常常用的工具,能夠完美的配合正則表達式使用,功能非常強大。
mkdir playgroundtouch test.txtecho "Hello world!" >> test.txtcat>test.txt<<EOF> i love you> my honey> be easy> last row> EOF例如:
(1) 刪除文檔的第一行
sed -i '1d' test.txtcat test.txt my honey be easy last row test.txt(2) 刪除文檔的第三行
sed -i '3d' test.txtcat test.txt my honey be easy test.txt(3) 刪除文檔的最后一行
sed -i '$d' test.txtcat 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.0-48-generic # kernel-release #51~16.04.1-Ubuntu SMP Fri Apr 5 12:01:12 UTC 2019 # 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.1 │ │ │ ├── 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 [0/742] │ │ │ ├── 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.cpp11 directories, 102 files tree(2) 利用-L參數,顯示到Level 2即停止,不會全部顯示出來,方便我們宏觀把握
cv@cv: ~$ tree -L 2 .├── 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.cpp4 directories, 51 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.cpp2 directories, 32 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 < 2, S = M * 2 Else S = M + 2但有時服務器訪問量確實很大,有可能出現?SWAP?分區不夠用的情況,需要手動構建,這是后話。
在?Linux上可使用?swapon -s?命令查看當前系統上正在使用的交換空間有哪些,以及相關信息。
cv@cv: ~$ swapon -s Filename Type Size Used Priority /dev/sdb8 partition 3905532 0 -2當?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 (11: Resource temporarily unavailable) E: Unable to lock directory /var/lib/apt/lists/解決方法
方法1:找出所有占用?apt?的進程
cv@cv: ~$ ps -A | grep apt終止這些占用進程
cv@cv: ~$ sudo kill -9 processnumber之后再?update?即可。
方法2:刪除被鎖定文件
cv@cv: ~$ sudo rm /var/cache/apt/archives/lockcv@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 updatedbBASE_PATH=$(dirname $(locate $0)) echo ${BASE_PATH}if [ $BASE_PATH == "TODO" ] thenecho "please modify this script with the base path of your bundler installation";exit; fiEXTRACT_FOCAL=${BASE_PATH}/bin/extract_focal.pl echo ${EXTRACT_FOCAL}echo "[- Done -]" cv@cv: ~/bundler$ bash runbundler.sh runbundler.sh: line 4: $'\r': command not found runbundler.sh: line 7: $'\r': command not found runbundler.sh: line 13: $'\r': command not found runbundler.sh: line 16: $'\r': command not found runbundler.sh: line 17: 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
轉載于:https://www.cnblogs.com/phillee/p/10789243.html
總結
以上是生活随笔為你收集整理的Linux系统常用命令以及常见问题的解决方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: P2050 [NOI2012]美食节
- 下一篇: 【Linux常用命令】grep命令