grep 獲取 字串 [論壇 - Ubuntu 程式設計]


正在瀏覽:   1 名遊客


 到底部   前一個主題   下一個主題  [無發表權] 請登錄或者註冊

(1) 2 »


grep 獲取 字串
會員一級
註冊日期:
3/5 2:17:10
所屬群組:
已註冊使用者
等級: 1
HP : 0 / 2
MP : 1 / 4
EXP: 10
離線
請問下列文字 要如何獲取 identifier

/dev/disk0 (internal, physical):
#: TYPE NAME SIZE IDENTIFIER
0: GUID_partition_scheme *128.0 GB disk0
1: EFI EFI 209.7 MB disk0s1
2: Apple_HFS InstallMacOS 8.9 GB disk0s2
3: Apple_HFS MacOS 118.6 GB disk0s3


想用grep 取得 MacOS的 IDENTIFIER 也就是 disk0s3

試過 grep -Eo "MacOS.*(disk.*)"

還是不行, 求各位大神幫忙

3/5 2:47:26
應用擴展 工具箱
回覆: grep 獲取 字串
會員三級
註冊日期:
2008/12/10 7:19
來自 好像有兩千三百萬人的島
所屬群組:
已註冊使用者
等級: 15
HP : 0 / 368
MP : 94 / 10532
EXP: 73
離線
這個問題用 awk 吧!

cat 你的檔案.txt | awk 'NR>2 {print $NF}'  # 從第三行起,每行都印出最後一欄


輸出結果:
disk0
disk0s1
disk0s2
disk0s3

3/5 8:48:51
「這社會上最讓人傷腦筋的事,恐怕是智者總在懷疑自己,而笨蛋們對自己卻從不懷疑。」
                    (伯特蘭‧羅素 1872年5月18日-1970年2月2日)
應用擴展 工具箱
回覆: grep 獲取 字串
會員五級
註冊日期:
2012/4/22 10:50
所屬群組:
已註冊使用者
等級: 34
HP : 165 / 825
MP : 538 / 15469
EXP: 1
離線
kengi 寫到:
請問下列文字 要如何獲取 identifier

/dev/disk0 (internal, physical):
   #:                       TYPE NAME                        SIZE              IDENTIFIER
   0:      GUID_partition_scheme                      *128.0 GB         disk0
   1:                        EFI EFI                                  209.7 MB        disk0s1
   2:                  Apple_HFS InstallMacOS              8.9 GB         disk0s2
   3:                  Apple_HFS MacOS                     118.6 GB        disk0s3


想用grep 取得 MacOS的 IDENTIFIER 也就是 disk0s3

試過 grep -Eo "MacOS.*(disk.*)"

還是不行, 求各位大神幫忙


雪凡 寫到:
這個問題用 awk 吧!

cat 你的檔案.txt | awk 'NR>2 {print $NF}'  # 從第三行起,每行都印出最後一欄


輸出結果:
disk0
disk0s1
disk0s2
disk0s3


================================================================================

假設樓主原本的那些資料存在「data.txt」裡

執行


grep ' MacOS ' data.txt



顯示


3: Apple_HFS MacOS 118.6 GB disk0s3



註:
關於「grep ' MacOS '」,
在「MacOS」這個單字,左右我各加了一個「空白」,
並且加上「單引號 '」框住,這樣「空白」就不會被「shell」吃掉。
這樣的查詢條件,用「grep」抓出來,就可以區隔「InstallMacOS」那一行。

================================================================================

接著再搭配「awk」抓出最後一個欄位


執行


grep ' MacOS ' data.txt | awk '{print $NF}'



顯示


disk0s3



註: 下面「#7」,只有使用「awk」來處理。

================================================================================


以上提供參考

3/5 9:33:01
應用擴展 工具箱
回覆: grep 獲取 字串
會員一級
註冊日期:
3/5 2:17:10
所屬群組:
已註冊使用者
等級: 1
HP : 0 / 2
MP : 1 / 4
EXP: 10
離線
原來要用AWK阿

可以了, 感謝~

但我在想是否能用GREP 正規表達式的方式呢?

3/5 10:29:32
應用擴展 工具箱
回覆: grep 獲取 字串
會員五級
註冊日期:
2012/4/22 10:50
所屬群組:
已註冊使用者
等級: 34
HP : 165 / 825
MP : 538 / 15469
EXP: 1
離線
kengi 寫到:
原來要用AWK阿

可以了, 感謝~

但我在想是否能用GREP 正規表達式的方式呢?



執行


grep ' MacOS ' data.txt | grep -Eo 'disk.*'



顯示


disk0s3



第二次過濾,不用「awk」,使用你原本「grep -Eo」的方式。

================================================================================

另外管線可以多次,

grep | cut | awk | sed | sort

可以一直串下去,直到過濾你想要的結果。

可以參考最近一個討論案例「#56 回覆: Ubuntu 17.10 推出」。

其他的討論案例紀錄在「[索引]如何執行指令」。


================================================================================

以上提供參考

3/5 10:38:27
應用擴展 工具箱
回覆: grep 獲取 字串
會員一級
註冊日期:
3/5 2:17:10
所屬群組:
已註冊使用者
等級: 1
HP : 0 / 2
MP : 1 / 4
EXP: 10
離線
是我要的, 太感謝了~

3/5 10:50:54
應用擴展 工具箱
回覆: grep 獲取 字串
會員五級
註冊日期:
2012/4/22 10:50
所屬群組:
已註冊使用者
等級: 34
HP : 165 / 825
MP : 538 / 15469
EXP: 1
離線
若是只要使用「awk」來處理,可以對照「#3」和「#5」的思路來看。

================================================================================

執行


awk '/ MacOS /' data.txt



顯示


3: Apple_HFS MacOS 118.6 GB disk0s3



================================================================================

然後若是要取出最後一個欄位,可以執行下面指令


awk '/ MacOS / {print $NF}' data.txt



顯示


disk0s3



要了解「awk」,可以查詢「awk」,可以找到一篇「參考文章」。

================================================================================

以上提供參考,

報告完畢


3/5 12:38:54
應用擴展 工具箱
回覆: grep 獲取 字串
會員三級
註冊日期:
2016/4/18 12:29
所屬群組:
已註冊使用者
等級: 9
HP : 0 / 208
MP : 35 / 1481
EXP: 35
離線
Hi 我又來借串問一下
請問如果用top觀察程式,並用grep過濾,我要如何移除不要的資訊,如CPU或MEM之外的通通不要
以init程式來說,使用
top |grep init

顯示
1 root 20 0 3120 1508 952 S 0.0 0.3 0:05.97 init

但我加上 awk {printf $NF}
top |grep init | awk {printf $NF}

會顯示

awk: line 1: no arguments in call to printf
awk: line 2: missing } near end of file

我想顯示後面三個數值,如下
1 root 0.0 0.3 0:05.97 init

再麻煩各位
謝謝

3/5 15:33:49
應用擴展 工具箱
回覆: grep 獲取 字串
會員五級
註冊日期:
2012/4/22 10:50
所屬群組:
已註冊使用者
等級: 34
HP : 165 / 825
MP : 538 / 15469
EXP: 1
離線
ubuntu_net2016 寫到:
Hi 我又來借串問一下
請問如果用top觀察程式,並用grep過濾,我要如何移除不要的資訊,如CPU或MEM之外的通通不要
以init程式來說,使用
top |grep init

顯示
1 root 20 0 3120 1508 952 S 0.0 0.3 0:05.97 init

但我加上 awk {printf $NF}
top |grep init | awk {printf $NF}

會顯示

awk: line 1: no arguments in call to printf
awk: line 2: missing } near end of file

我想顯示後面三個數值,如下
1 root 0.0 0.3 0:05.97 init

再麻煩各位
謝謝


================================================================================

關於



awk {printf $NF}



後面那一段要用「單引號'」框住,並且是使用「print」,不是「printf」。


awk '{print $NF}'



可以參考「#3」下面這一行


grep ' MacOS ' data.txt | awk '{print $NF}'




* https://www.gnu.org/software/gawk/manual/gawk.html#Very-Simple
* https://www.gnu.org/software/gawk/manual/gawk.html#Print
* https://www.gnu.org/software/gawk/manual/gawk.html#Printf


================================================================================

回到你原本要問的,下面是參考指令,我是以「firefox」舉例


top | awk '/firefox/ {print $2, $3, $(NF-4), $(NF-3), $(NF-2), $(NF-1)}'



顯示


1507 user 3.6 6.3 84:35.73 firefox
1507 user 0.7 6.3 84:35.75 firefox
1507 user 0.3 6.3 84:35.76 firefox
...略...



預設應該是用「空白字元」當切割,而下面則是欄位對照表


$1           ==> 表示第一個欄位
$2           ==> 表示第二個欄位
$3           ==> 表示第三個欄位
$(NF-4)      ==> 表示倒數第五個欄位
$(NF-3)      ==> 表示倒數第四個欄位
$(NF-2)      ==> 表示倒數第三個欄位
$(NF-1)      ==> 表示倒數第二個欄位
$NF          ==> 表示倒數第一個欄位



而「top」也可以額外設定一些參數,再搭配「awk」。


top -b -n 1 | awk '/firefox/ {print $1, $2, $(NF-3), $(NF-2), $(NF-1), $NF}'



或是先「grep」,再搭配「awk」


top -b -n 1 | grep 'firefox' | awk '{print $1, $2, $(NF-3), $(NF-2), $(NF-1), $NF}'



而從「ps」,也可以顯示想要關注的欄位

執行


ps -eo pid,user,%cpu,%mem,bsdtime,comm | grep firefox



或是執行


ps axo pid,user,%cpu,%mem,bsdtime,comm | grep firefox



或是執行


ps -Ao pid,user,%cpu,%mem,bsdtime,comm | grep firefox



顯示


1507 user 10.3 6.5 83:41 firefox



執行


$ ps -C firefox -o pid,user,%cpu,%mem,bsdtime,comm



顯示


PID   USER     %CPU  %MEM   TIME  COMMAND
1507  user     10.2  7.2    88:09 firefox





================================================================================

上面的範例,「awk」是用「print」,下面則是使用「printf」來當範例。


top | awk '/firefox/ {printf "印出 %s %s %s %s %s %s\n", $2, $3, $(NF-4), $(NF-3), $(NF-2), $(NF-1)}'



顯示


印出 1507 user 0.3 6.2 84:36.33 firefox
印出 1507 user 2.0 6.3 84:36.39 firefox
印出 1507 user 1.0 6.2 84:36.42 firefox
...略...




而「top」也可以額外設定一些參數,再搭配「awk」。


top -b -n 1 | awk '/firefox/ {printf "印出 %s %s %s %s %s %s\n", $1, $2, $(NF-3), $(NF-2), $(NF-1), $NF}'



或是先「grep」,再搭配「awk」


top -b -n 1 | grep 'firefox' | awk '{printf "印出 %s %s %s %s %s %s\n", $1, $2, $(NF-3), $(NF-2), $(NF-1), $NF}'



================================================================================

接下來討論如何設定切割依據。

假設「data.txt」的內容如下


1:2:3
a:b:c



可以執行下面指令


awk -F ':' '{print $2}' data.txt



關於「-F ':'」,表示依據「:」來切割。
關於「'{print $2}'」,表示只有印出第二個欄位。

所以上面的指令,會顯示如下


2
b



================================================================================

假設「data.txt」的內容如下


1==2==3
a==b==c



可以執行下面指令


awk -F '==' '{print $2}' data.txt



關於「-F '=='」,表示依據「==」來切割。
關於「'{print $2}'」,表示只有印出第二個欄位。

所以上面的指令,會顯示如下


2
b



================================================================================

假設「data.txt」的內容如下


1:2:3
a:b:c



可以執行下面指令


awk 'BEGIN {FS=":"} {print $2}' data.txt



這裡就不透過「-F ':'」,改用「BEGIN {FS=":"}」,表示依據「:」來切割。
關於「'{print $2}'」,表示只有印出第二個欄位。

所以上面的指令,會顯示如下


2
b



================================================================================

假設「data.txt」的內容如下


1:2:3
a:b:c



可以執行下面指令


awk -v FS=':' '{print $2}' data.txt



這裡就不透過「-F ':'」,也不透過「BEGIN {FS=":"}」,
是透過「-v FS=':'」表示依據「:」來切割。
關於「'{print $2}'」,表示只有印出第二個欄位。

所以上面的指令,會顯示如下


2
b



================================================================================

假設「data.txt」的內容如下


1:2:3
a:b:c



也可以改用「cut」來切割,以執行下面指令


cat data.txt | cut -d ':' -f 2



關於「-d ':'」,表示依據「:」來切割。
關於「-f 2」,表示印出第二個欄位。

所以上面的指令,會顯示如下


2
b



註:在「cut」的「-d ':'」只能一個字元,所以不能接「-d '=='」。

================================================================================

$ man awk
$ man cut

* https://www.gnu.org/software/gawk/manual/
* https://www.gnu.org/software/gawk/manual/html_node/Very-Simple.html#Very-Simple
* https://www.gnu.org/software/gawk/manual/html_node/Print.html#Print
* https://www.gnu.org/software/gawk/manual/html_node/Printf.html#Printf
* https://www.gnu.org/software/gawk/manual/html_node/Options.html#Options
* https://www.gnu.org/software/gawk/manual/html_node/Field-Separators.html#Field-Separators
* https://www.gnu.org/software/gawk/manual/html_node/User_002dmodified.html#User_002dmodified

================================================================================

例外可以從寫程式的角度來看這些概念,概念是相通的

以「php」為例

假設「data.txt」的內容如下


1:2:3
a:b:c



下面的是「test.php」的內容


#!/usr/bin/env php
<?php

$data = file('data.txt');

foreach ($data as $num => $line) {
	$line = trim($line);

	$cols = explode(':', $line);

	printf("%s\n", $cols[1]);
}



執行


chmod u+x test.php



然後執行


$ ./test.php



顯示


2
b



================================================================================

下面的則是「test2.php」的內容


#!/usr/bin/env php
<?php

$contents = file_get_contents('data.txt');

$data = explode("\n", $contents);

foreach ($data as $num => $line) {
	$line = trim($line);

	$cols = explode(':', $line);

	if (!array_key_exists(1, $cols)) {
		continue;
	}

	printf("%s\n", $cols[1]);
}



================================================================================

之前有簡單寫了一些範例放在「GitHub」上。

================================================================================

* http://php.net/manual/en/function.file.php
* http://php.net/manual/en/function.file-get-contents.php
* http://php.net/manual/en/function.explode.php
* http://php.net/manual/en/function.printf.php
* http://php.net/manual/en/function.trim.php
* http://php.net/manual/en/language.types.array.php
* http://php.net/manual/en/control-structures.foreach.php
* http://php.net/manual/en/control-structures.continue.php
* http://php.net/manual/en/function.array-key-exists.php

================================================================================

以上提供參考

報告完畢


3/5 16:20:51
應用擴展 工具箱
回覆: grep 獲取 字串
會員五級
註冊日期:
2012/4/22 10:50
所屬群組:
已註冊使用者
等級: 34
HP : 165 / 825
MP : 538 / 15469
EXP: 1
離線
ubuntu_net2016 寫到:
Hi 我又來借串問一下
請問如果用top觀察程式,並用grep過濾,我要如何移除不要的資訊,如CPU或MEM之外的通通不要
以init程式來說,使用
top |grep init

顯示
1 root 20 0 3120 1508 952 S 0.0 0.3 0:05.97 init

但我加上 awk {printf $NF}
top |grep init | awk {printf $NF}

會顯示

awk: line 1: no arguments in call to printf
awk: line 2: missing } near end of file

我想顯示後面三個數值,如下
1 root 0.0 0.3 0:05.97 init

再麻煩各位
謝謝


除了上面「#9」回覆您的。

剛研究一下「top」怎麼使用?
因為其實我很少用它,所以以前也沒去深究它怎麼使用 :p

剛查到一篇「參考文章」。

先執行


$ top



然後按下「f」,就可以選擇要顯示的欄位,目前有顯示的欄位,前面會有「*」
然後可以用「上下鍵」來移動,在要選擇的欄位,按下「空白鍵」切換。
設定好後,按下「q」離開設定,就會看到顯示的欄位有所增減。


額外紀錄剛找到的另一篇「參考文章」。

================================================================================

另外印象中,以前常看到網路上推薦另一個工具「htop」。

執行下面指令,安裝「htop」這個「Package」。


$ sudo apt-get install htop




然後執行


$ htop



畫面最下方就有快速鍵的按鈕,可以參考。
按下「F1」或「h」,觀看「Help」。
按下「F2」或「S」,做設定。<-- 注意「S」是大寫。

然後在第一個欄位「Setup」,按「上下鍵」,移動到「Columns」,
接著按下「Tab鍵」或是「右鍵」,會移動到第二個欄位「Active Columns」,
一樣可以按「上下鍵」移動,然後按下「F9」,就會刪除該欄位,這樣就不會顯示該欄位了,
然後按下「Esc」或是「F10」離開設定畫面。

有滑鼠支援,也可以使用滑鼠操作。

設定完,應該會紀錄在「~/.config/htop/htoprc」這個檔案,
若要恢復原狀,只要刪除「~/.config/htop/htoprc」這個檔案就可以了


$ rm ~/.config/htop/htoprc



然後再執行「htop」

================================================================================

## 類似圖形界面工具 (GUI)

* qps <-- 我在「Ubuntu 17.10」裝「lxqt」,會一併裝「qps」。
* gnome-system-monitor
* xfce4-taskmanager
* ksysguard

想到之前看到的一篇「文章」,還沒去深究,剛好順手紀錄一下連結。

================================================================================

以上提供參考


3/5 20:23:30
應用擴展 工具箱

(1) 2 »

 [無發表權] 請登錄或者註冊


可以查看帖子.
不可發帖.
不可回覆.
不可編輯自己的帖子.
不可刪除自己的帖子.
不可發起投票調查.
不可在投票調查中投票.
不可上傳附件.
不可不經審核直接發帖.