對(duì)于管理員或用戶而言,命令行不僅是可以完成所有任務(wù)的工具,而且還是可以永遠(yuǎn)開(kāi)發(fā)的高度定制的工具。
最近,有一篇有關(guān)CLI中一些有用技巧的翻譯文章。但是我覺(jué)得翻譯人員沒(méi)有足夠的CLI經(jīng)驗(yàn),也沒(méi)有遵循所描述的技巧,因此許多重要的事情可能會(huì)被遺漏或誤解。
根據(jù)個(gè)人經(jīng)驗(yàn),在Linux Shell中有12種技巧。
注意:本文中的所有腳本和示例都經(jīng)過(guò)了盡可能地簡(jiǎn)化,因此也許您會(huì)發(fā)現(xiàn)一些看起來(lái)完全沒(méi)用的技巧–也許就是這個(gè)原因。但無(wú)論如何,請(qǐng)?jiān)谠u(píng)論中分享您的想法!
人們經(jīng)常使用cut甚至awk只是通過(guò)模式或使用分隔符減去字符串的一部分。
另外,許多人使用$ {VARIABLE:start_position:length}進(jìn)行子字符串bash操作,這非常快。
但是bash提供了一種使用#,##,%和%%來(lái)處理文本字符串的強(qiáng)大方法-它稱為bash變量擴(kuò)展。
使用此語(yǔ)法,您可以在無(wú)需執(zhí)行外部命令的情況下減少模式的需要,因此它將非??焖俚毓ぷ鳌?
下面的示例顯示了如何使用cut或變量擴(kuò)展從字符串中獲取第三列(shell),其中用冒號(hào)?username:homedir:shell?分隔的值(我們使用*: mask和##命令,這意味著:將所有字符向左剪切,直到找到最后一個(gè)冒號(hào)為止):
第二個(gè)選項(xiàng)不啟動(dòng)子進(jìn)程(cut),并且根本不使用管道,這樣可以更快地工作。而且,如果您在管道幾乎不移動(dòng)的Windows上使用bash子系統(tǒng),則速度差異會(huì)很大。
讓我們看一下Ubuntu上的示例:循環(huán)執(zhí)行我們的命令1000次
結(jié)果
差別是幾十倍!
當(dāng)然,上面的例子太人為了。在實(shí)際示例中,我們將不使用靜態(tài)字符串,而是要讀取真實(shí)文件。對(duì)于“ cut ”命令,我們只將/etc /passwd重定向到它。在##的情況下,我們必須創(chuàng)建一個(gè)循環(huán)并使用內(nèi)部的' read '命令讀取文件。那么誰(shuí)將贏得這場(chǎng)案子呢?
結(jié)果
還有兩個(gè)示例:
在等號(hào)后提取值:
提取括號(hào)中的文本:
bash-completion軟件包幾乎是每個(gè)Linux發(fā)行版的一部分。您可以在/etc/bash.bashrc或/etc/profile.d/bash_completion.sh中啟用它,但是通常默認(rèn)情況下已啟用它。通常,自動(dòng)完成是新手首先遇到的Linux Shell上的第一個(gè)便捷時(shí)刻。
但是并非所有人都使用所有bash補(bǔ)全功能這一事實(shí),在我看來(lái)完全是徒勞的。例如,不是所有人都知道,自動(dòng)完成功能不僅適用于文件名,而且適用于別名,變量名,函數(shù)名,甚至適用于某些帶有參數(shù)的命令。如果您深入研究自動(dòng)完成腳本(實(shí)際上是shell腳本),甚至可以為自己的應(yīng)用程序或腳本添加自動(dòng)完成。
但是,讓我們回到別名。
您無(wú)需編輯PATH變量或在指定目錄中創(chuàng)建文件即可運(yùn)行別名。您只需要將它們添加到配置文件或啟動(dòng)腳本中,然后在任何位置執(zhí)行它們即可。
通常,我們?cè)? nix中使用小寫(xiě)字母表示文件和目錄,因此創(chuàng)建大寫(xiě)別名非常方便-在這種情況下,bash-completion 幾乎會(huì)用單個(gè)字母來(lái)猜測(cè)您的命令:
對(duì)于更復(fù)雜的情況,可能您想將個(gè)人腳本放入$ HOME / bin。
但是我們?cè)赽ash中有功能。
函數(shù)不需要路徑或單獨(dú)的文件。(注意)bash補(bǔ)全也可以與函數(shù)一起使用。
讓我們?cè)?profile中創(chuàng)建函數(shù)LastLogin (不要忘記重新加載.profile):
在控制臺(tái)中(請(qǐng)注意,函數(shù)名的首字母大寫(xiě)以加快bash的完成速度):
如果您在控制臺(tái)中的任何命令前放置空格,則它將不會(huì)出現(xiàn)在命令歷史記錄中,因此,如果您需要在命令中放置純文本密碼,這是使用此功能的一種好方法—在下面的示例中回顯?hello 2?將不會(huì)出現(xiàn)在歷史記錄中:
它是可選的
您想在git中存儲(chǔ)一些shell腳本以在服務(wù)器之間共享它們,或者它可能是應(yīng)用程序啟動(dòng)腳本的一部分。并且您希望此腳本將連接到數(shù)據(jù)庫(kù)或執(zhí)行其他需要憑據(jù)的操作。
當(dāng)然,將憑據(jù)存儲(chǔ)在腳本本身中是個(gè)壞主意,因?yàn)間it是不安全的。
通常,您可以使用已經(jīng)在目標(biāo)環(huán)境上定義的變量,并且腳本本身將不包含密碼。
例如,您可以在具有700個(gè)權(quán)限的每個(gè)環(huán)境上創(chuàng)建小腳本,并使用主腳本中的source命令調(diào)用它:
但這并不安全。
如果其他人可以登錄到您的
主機(jī),則他只需執(zhí)行ps命令并查看帶有整個(gè)命令行參數(shù)(包括密碼)的sqlplus進(jìn)程。因此,安全工具通常應(yīng)該能夠直接從文件中讀取密碼/密鑰/敏感數(shù)據(jù)。
例如,安全ssh甚至沒(méi)有任何選項(xiàng)可以在命令行中提供密碼。但是他可以從文件讀取ssh密鑰(并且可以在ssh密鑰文件上設(shè)置安全權(quán)限)。
非安全wget具有選項(xiàng)“ --password”,該選項(xiàng)使您可以在命令行中提供密碼。wget一直在運(yùn)行,每個(gè)人都可以執(zhí)行ps命令并查看您提供的密碼。
另外,如果您有很多敏感數(shù)據(jù),并且想通過(guò)git控制它,那么唯一的方法就是加密。因此,您只需將每個(gè)主密碼以及所有其他可以加密并放入git的數(shù)據(jù)輸入到每個(gè)目標(biāo)環(huán)境。而且,您可以使用open
ssl CLI界面從命令行使用加密的數(shù)據(jù)。以下是從命令行進(jìn)行加密和解密的示例:
文件secret.key包含主密鑰-單行:
讓我們使用aes-256-cbc加密字符串:
您可以將此加密的字符串放入git或其他任何位置存儲(chǔ)的任何配置文件中-沒(méi)有secret.key,幾乎不可能對(duì)其進(jìn)行解密。
要解密執(zhí)行同一命令,只需將-e替換為-d即可:
所有人都應(yīng)該知道grep命令。并且對(duì)正則表達(dá)式要友好。通常,您可以編寫(xiě)如下內(nèi)容:
甚至像這樣:
但是不要忘記grep有很多很棒的選擇。例如-v,它會(huì)還原您的搜索并顯示除“ info”消息以外的所有消息:
其他內(nèi)容:
選項(xiàng)-P非常有用,因?yàn)槟J(rèn)情況下,grep使用相當(dāng)過(guò)時(shí)的?基本正則表達(dá)式:?,并且-P啟用PCRE,甚至不知道分組。
-i忽略大小寫(xiě)。
--line-buffered立即解析行,而不是等待到達(dá)標(biāo)準(zhǔn)的4k緩沖區(qū)(對(duì)于tail -f | grep非常有用)。
如果您非常了解正則表達(dá)式,則使用--only-matching / -o可以真正實(shí)現(xiàn)剪切文本的出色功能。只需比較以下兩個(gè)命令以提取myuser的shell:
第二個(gè)命令看起來(lái)更編譯,但是它只運(yùn)行g(shù)rep而不是grep和cut,因此執(zhí)行時(shí)間會(huì)更少。
在* nix中,如果刪除應(yīng)用程序當(dāng)前正在使用的日志文件,則不能僅刪除所有日志,還可以阻止應(yīng)用程序在重新啟動(dòng)之前編寫(xiě)新日志。
由于文件描述符不是打開(kāi)文件名而是打開(kāi)iNode結(jié)構(gòu),因此應(yīng)用程序?qū)⒗^續(xù)將文件描述符寫(xiě)入沒(méi)有目錄條目的文件,并且該文件將在應(yīng)用程序停止后由文件系統(tǒng)自動(dòng)刪除(您的應(yīng)用程序可以每次想寫(xiě)一些東西來(lái)避免這種問(wèn)題時(shí)都要打開(kāi)和關(guān)閉日志文件,但這會(huì)影響性能)。
因此,如何清除日志文件而不刪除它:
或者我們可以使用truncate命令:
提及,該truncate命令將刪除文件的其余部分,因此您將丟失最新的日志事件。另一個(gè)示例如何存儲(chǔ)最后1000行:
PS在Linux中,我們有標(biāo)準(zhǔn)的服務(wù)rotatelog。您可以將日志添加到自動(dòng)截?cái)?旋轉(zhuǎn)中,也可以使用現(xiàn)有的日志庫(kù)來(lái)完成(例如Java中的log4j)。
在某些情況下,您正在等待事件結(jié)束。例如,當(dāng)另一個(gè)用戶登錄到shell(您連續(xù)執(zhí)行who命令)時(shí),或者某人應(yīng)該使用scp或ftp將文件復(fù)制到您的計(jì)算機(jī)上時(shí),您正在等待完成(重復(fù)ls數(shù)十次)。
在這種情況下,您可以使用
默認(rèn)情況下,將每隔2秒鐘執(zhí)行一次,且屏幕會(huì)預(yù)先清除,直到按Ctrl + C。您可以配置執(zhí)行頻率。
當(dāng)您要觀看實(shí)時(shí)日志時(shí),此功能非常有用。
創(chuàng)建范圍非常有用。例如,而不是像這樣:
您可以編寫(xiě)以下內(nèi)容:
您也可以使用seq命令生成格式化范圍。例如,我們可以使用seq創(chuàng)建值,將根據(jù)寬度(00、01而不是0、1)自動(dòng)調(diào)整抽動(dòng):
使用命令替換的另一個(gè)示例-重命名文件。要獲取不帶擴(kuò)展名的文件名,我們使用“ basename ”命令:
甚至還比'%'更短:
PS實(shí)際上,對(duì)于重命名文件,您可以嘗試使用具有許多選項(xiàng)的“ 重命名 ”工具。
另一個(gè)示例-讓我們?yōu)樾碌腏ava項(xiàng)目創(chuàng)建結(jié)構(gòu):
結(jié)果
加薪,首先要高效,Linux shell的12個(gè)巧妙技巧讓你運(yùn)維高效
我已經(jīng)提到了multitail來(lái)讀取文件并觀看多個(gè)實(shí)時(shí)日志。但是默認(rèn)情況下未提供該功能,并且安裝某些內(nèi)容的權(quán)限并非始終可用。
但是標(biāo)準(zhǔn)尾巴也可以做到:
還讓您記住有關(guān)用戶的信息,這些用戶使用'tail -f'別名查看應(yīng)用程序日志。
多個(gè)用戶可以使用“ tail -f”同時(shí)觀看日志文件。他們中有些人的會(huì)話不太準(zhǔn)確。由于某種原因,他們可能會(huì)將'tail -f'留在背景中而忘記了。
如果重新啟動(dòng)應(yīng)用程序,則有一些正在運(yùn)行的“ tail -f”進(jìn)程正在監(jiān)視不存在的日志文件,該進(jìn)程可能會(huì)掛起幾天甚至幾個(gè)月。
通常這不是一個(gè)大問(wèn)題,但不是整齊的。
如果您使用別名來(lái)查看日志,則可以使用--pid選項(xiàng)修改此別名:
在這種情況下,重新啟動(dòng)目標(biāo)應(yīng)用程序時(shí),所有尾部將自動(dòng)終止。
10.創(chuàng)建具有指定大小的文件
dd是使用塊和二進(jìn)制數(shù)據(jù)的最受歡迎的工具之一。例如,創(chuàng)建1 MB文件并填充零將是:
但我建議使用fallocate:
在支持分配功能(xfs,ext4,Btrfs ...)的文件系統(tǒng)上,fallocate將立即執(zhí)行,這與dd工具不同。另外,分配是指實(shí)際分配塊,而不是創(chuàng)建備用文件。
很多人都知道流行的xargs命令。但是并非所有人都使用以下兩個(gè)選項(xiàng),因此可以極大地改善腳本。
首先-您可以獲得非常長(zhǎng)的參數(shù)列表,并且可能超過(guò)命令行長(zhǎng)度(默認(rèn)情況下?4 kb)。
但是您可以使用-n選項(xiàng)限制執(zhí)行,因此xargs將多次運(yùn)行命令,一次發(fā)送指定數(shù)量的參數(shù):
來(lái)吧 處理長(zhǎng)列表可能需要很多時(shí)間,因?yàn)樗趩蝹€(gè)線程中運(yùn)行。但是,如果我們有幾個(gè)核心,我們可以告訴xargs并行運(yùn)行:
在上面的示例中,我們告訴xargs處理3個(gè)線程中的list;每個(gè)線程每次執(zhí)行將接受并處理2個(gè)參數(shù)。如果您不知道自己有多少個(gè)內(nèi)核,請(qǐng)使用“ nproc ” 進(jìn)行優(yōu)化:
有時(shí)您需要等待幾秒鐘。或等待用戶輸入以下內(nèi)容:
但是您只需添加超時(shí)選項(xiàng)以讀取命令,腳本就會(huì)暫停指定的秒數(shù),但是在交互執(zhí)行的情況下,用戶可以輕松地跳過(guò)等待。
因此,您只需忘記睡眠命令即可。
我懷疑并不是所有的花招看起來(lái)都很有趣,但是在我看來(lái),有十二個(gè)數(shù)字是可以填寫(xiě)的好數(shù)字。
標(biāo)題名稱:加薪,首先要高效,Linux shell的12個(gè)巧妙技巧讓你運(yùn)維高效
URL標(biāo)題:http://www.rwnh.cn/news/102933.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站設(shè)計(jì)公司、品牌網(wǎng)站制作、企業(yè)網(wǎng)站制作、網(wǎng)站內(nèi)鏈、ChatGPT、動(dòng)態(tài)網(wǎng)站
廣告
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源:
創(chuàng)新互聯(lián)