क्या मैं इस फ़िल्टर को छोटा कर सकता हूं, जो 100G पर डिस्क आकार पाता है?


12

मेरा लक्ष्य lsblk से 100G से अधिक डिस्क प्राप्त करना है।

मेरे पास यह काम कर रहा है, लेकिन यह अजीब है। मुझे पूरा यकीन है कि इसे छोटा किया जा सकता है। या तो lsblk से पूरी तरह से अलग कुछ का उपयोग करके, या शायद मैं मानव पठनीय संख्याओं को सीधे awk के साथ फ़िल्टर कर सकता हूं।

यहाँ मैं एक साथ रखा है:

lsblk | grep disk | awk '{print$1,$4}' | grep G | sed 's/.$//' | awk '{if($2>100)print$1}'

यह 100G से बड़े डिस्क के केवल sdx और nvmexxx भाग का उत्पादन करता है। वास्तव में मुझे क्या चाहिए।

मैं इससे खुश हूं, लेकिन आप से अधिक सीखने के लिए उत्सुक हूं,


100-999GB के बीच और 100T से बड़ा, लेकिन 1-99T के बीच कुछ भी नहीं, मुझे लगता है? (टेराबाइट्स ~)
हैन्सेनरिक

हां, यह एक दोष है जिसने मेरा ध्यान आकर्षित किया और जवाबों में पहले से ही चर्चा में था। इसलिए मैंने मानव पठनीय के बजाय बाइट के आकार के आधार पर फ़िल्टर करने के उत्तर को स्वीकार किया। यदि आप एक और विधि के बारे में जानने के लिए मुझे खुशी होगी।
चेल्याबिंउ

जवाबों:


28

आप अपने इच्छित आउटपुट के रूप को निर्दिष्ट कर सकते हैं lsblk:

% lsblk -nblo NAME,SIZE
mmcblk0   15931539456
mmcblk0p1   268435456
mmcblk0p2 15662038528

उपयोग किए गए विकल्प :

-b, --bytes
      Print the SIZE column in bytes rather than in human-readable format.

-l, --list
      Use the list output format.

-n, --noheadings
      Do not print a header line.

-o, --output list
      Specify which output columns to print.  Use --help to get a list of  all  supported
      columns.

फिर छानना आसान है:

% lsblk -nblo NAME,SIZE | awk '$2 > 4*2^30 {print $1}' # greater than 4 GiB
mmcblk0
mmcblk0p2

आपके मामले में, यह 100*2^30100GiB या 100e9/ 1e11100GB के लिए होगा।


उह, यह चतुर है! पहली जगह में क्या जरूरत है बाहर निराई। एक सवाल: आप एक्स * 2 ** 30 का उपयोग सिर्फ बाइट्स के साथ स्थिरता के लिए कर रहे हैं? क्या s.th का उपयोग करने में कोई कमी होगी। 10 ** 3 की तरह?
चेल्यब्युम

@chalybeum हाँ, बाइट्स के लिए। नहीं, आप 10 ** 9 का उपयोग कर सकते हैं। मान सभी बहुत भिन्न नहीं होते हैं।
मुरु

ध्यान दें कि ओपी वन-लाइनर में विभाजन को फ़िल्टर कर रहा है।
अंकलकार


1
ध्यान दें कि इस विशेष मामले में 100G सीमा awk को भी egrep '\d{12,}'अनुक्रम में <12 अंकों के साथ लाइनों को हटाने के लिए छोटा किया जा सकता है । अवाक बेशक अधिक सार्वभौमिक है।
Gnudiff

18

आप lsblkJSON फॉर्मेट में आउटपुट भी बता सकते हैं और फ़िल्टरिंग भी कर सकते हैं jq:

$ lsblk -Jb | jq -r '..|select(.size? >= 1e11).name'
sda
sda2

या:

$ lsblk -Jb | jq -r '..|select(.type? == "disk" and .size? >= 1e11).name'
sda

प्रकार की प्रविष्टियों तक सीमित करने के लिए disk

( 1e11100 GB जा रहा है। 100 GiB के साथ बदलें 107374182400(या 100*1024*1024*1024)। गोलाई के कारण, lsblkबिना -bरिपोर्ट के 100G आकार के बारे में 99.9278 से लेकर 100.0488 GiB (किसी कारण के लिए)

इसके साथ lsblk -OJb, lsblkसभी उपलब्ध सूचनाओं को रिपोर्ट करता है जो आपको अधिक जुर्माना-चयन या आउटपुट को अधिक या अधिक प्रासंगिक जानकारी देता है।

आप सीधे जानकारी भी प्राप्त कर सकते हैं /sys। के साथ zsh:

$ printf '%s\n' /sys/class/block/*(e'[(($(<$REPLY/size) * 512 >= 1e11))]':t)
sda
sda2

यह एक गुरु का सच्चा उत्तर है, कोई भी इसे पढ़ नहीं पाएगा। : D
आर्चेमर

मुझे यह जानकर अच्छा लगा। लेकिन अपनी यात्रा के इस पड़ाव में मैं अभी तक एक और उपकरण का उपयोग करके और जटिलता का परिचय नहीं देना चाहता।
चेल्याबिंउ

यह एक अच्छा अनुप्रयोग है jq(जो मैंने कुछ महीने पहले ही सीखा था)।
डब्यू

6

प्रयत्न

lsblk| awk '$4 ~ /G$/ && $4+0 > 100 {print $1}'

यह एक ही समय में grep और फ़िल्टर करेगा।

  • $4 ~ /G$/ जी में आकार के साथ दायर करें
  • $4+0 > 100 100G पर आकार प्राप्त करें
  • {print $1} नाम छापें

एक नियम के रूप में आपको कभी भी grepऔर awkएक ही पाइप में उपयोग करने की आवश्यकता नहीं होनी चाहिए ।

केवल डिस्क (और कोई विभाजन नहीं) पाने के लिए: awk filtering

lsblk| awk '$4 ~ /G$/ && $4+0 > 100 && $6 == "disk"  {print $1}'

कहाँ पे

  • $6 == "disk" डिस्क के साथ केवल कॉलम चुनें

केवल डिस्क (और कोई विभाजन नहीं) पाने के लिए: lsblk फ़िल्टरिंग

lsblk --nodeps| awk '$4 ~ /G$/ && $4+0 > 100 {print $1}'

कहाँ पे

  • --nodeps : -d, --nodeps दास या धारकों को प्रिंट नहीं करते हैं

लगभग वहाँ पहुँच गया। यह अभी भी विभाजन छापता है। लेकिन मुझे लगता है कि मैं उस समय पीछे रह सकता हूं जब मेरे पास थोड़ा खाली समय होगा।
चेल्याबिंउ

1
@chalybeum मैंने तय किया कि, एक ही फ़िल्टरिंग ट्रिक को muru के उत्तर पर लागू किया जा सकता है।
आर्केमर

(हालांकि मैं शायद --no-depsउस उत्तर की सामान्य शैली को ध्यान में रखते हुए विकल्प का उपयोग करूंगा )
muru

2
मुझे डर है कि यह डिस्क को पकड़ने में विफल होगा जिसका आकार टेराबाइट्स (या बड़ी इकाइयों) में दिखाया गया है।
fra-san

@ fra- सान निष्पक्ष बिंदु और मेरे मूल समाधान के लिए भी सही है। इसलिए मैं यहां से डिस्क फिल्टर बिट ले जा रहा हूं और इसे बाइट रूपांतरण में डाल रहा हूं।
चेल्याबिंउ
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.