किसी दस्तावेज़ में लाइनों की गणना कैसे करें?


1075

मेरे पास इन जैसी लाइनें हैं, और मैं जानना चाहता हूं कि वास्तव में मेरे पास कितनी लाइनें हैं ...

09:16:39 AM  all    2.00    0.00    4.00    0.00    0.00    0.00    0.00    0.00   94.00
09:16:40 AM  all    5.00    0.00    0.00    4.00    0.00    0.00    0.00    0.00   91.00
09:16:41 AM  all    0.00    0.00    4.00    0.00    0.00    0.00    0.00    0.00   96.00
09:16:42 AM  all    3.00    0.00    1.00    0.00    0.00    0.00    0.00    0.00   96.00
09:16:43 AM  all    0.00    0.00    1.00    0.00    1.00    0.00    0.00    0.00   98.00
09:16:44 AM  all    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
09:16:45 AM  all    2.00    0.00    6.00    0.00    0.00    0.00    0.00    0.00   92.00

क्या लिनक्स कमांड्स का उपयोग करके उन सभी को गिनने का कोई तरीका है?


4
g <Ctrl-g>
Vim

30
@ Luv33preet तब आप अपने आप को SO पर वापस पाएं, vim से बाहर निकलने का तरीका तलाश रहे हैं
Skylar Ittner

5
@SkylarIttner और अगर आपको यह देखना है कि विम से बाहर कैसे निकलना है, <esc> :q!तो इसका एकमात्र जवाब है। (यह एक मज़ाक है, इससे सभी सहेजे न गए बदलावों को हटा दिया जाएगा - मज़ाक यह है कि अगर आपको नहीं पता कि यह किसी फ़ाइल को गड़बड़ाना आसान है, तो इसे सहेजना बेहतर नहीं है)।
रयान

जवाबों:


2029

उपयोग करें wc:

wc -l <filename>

यह <filename>निम्न पंक्तियों की संख्या का उत्पादन करेगा :

$ wc -l /dir/file.txt
3272485 /dir/file.txt

या, <filename>परिणाम के उपयोग से बाहर निकलने के लिए wc -l < <filename>:

$ wc -l < /dir/file.txt
3272485

आप डेटा को भी पाइप कर सकते हैं wc:

$ cat /dir/file.txt | wc -l
3272485
$ curl yahoo.com --silent | wc -l
63

18
यह महान है!! आप लाइन नंबर में संलग्न फ़ाइल नाम से छुटकारा पाने के लिए awk का उपयोग कर सकते हैं जैसे:wc -l <file> | awk '{print $1}
CheeHow

80
इससे भी छोटा, आप कर सकते हैंwc -l < <filename>
Tensigh

5
@ GGB667 आप फ़ाइल नाम से भी छुटकारा पा सकते हैंcat <file> | wc -l
baptx

14
और watch wc -l <filename>आप वास्तविक समय में इस फ़ाइल का अनुसरण कर सकते हैं। उदाहरण के लिए लॉग फ़ाइलों के लिए यह उपयोगी है।
डार्कसाइड

27
खबरदार जो wl -l "newlines" को गिनता है। यदि आपके पास पाठ की 2 पंक्तियों और उनके बीच एक "newline" प्रतीक है, तो wc "2" के बजाय "1" आउटपुट करेगा।
कॉन्सटेंटिन

140

सभी लाइनों के उपयोग की गणना करने के लिए:

$ wc -l file

केवल पैटर्न उपयोग के साथ लाइनों को फ़िल्टर और गिनने के लिए:

$ grep -w "pattern" -c file  

या -v का प्रयोग इनवर्ट मैच के लिए करें:

$ grep -w "pattern" -c -v file 

देखने के लिए grep मैन पेज देखें -e, -i और -x args ...


अजीब तरह से कभी-कभी grep -cमेरे लिए बेहतर काम करता है। मुख्य रूप से wc -lकष्टप्रद "फ़ीचर" के कारण पैडिंग स्पेस प्रीफ़िक्स।
MarkHu


43

बहुत तरीके हैं। उपयोग wcएक है।

wc -l file

अन्य में शामिल हैं

awk 'END{print NR}' file

sed -n '$=' file (GNU sed)

grep -c ".*" file

3
हां, लेकिन wc -l fileआपको लाइनों की संख्या और फ़ाइल नाम को आप केवल फ़ाइल नाम प्राप्त कर सकते हैं:filename.wc -l < /filepath/filename.ext
ggb667

GNU grep -H तर्क का उपयोग फ़ाइल नाम और गिनती देता है। grep -Hc ".*" file
ज़लेमिनि

मैंने इस समाधान को वोट किया क्योंकि wc -lकिसी फ़ाइल में नई रेखाएँ और वास्तविक रेखाएँ नहीं हैं। इस उत्तर में शामिल सभी अन्य कमांड आपको लाइनों की आवश्यकता के मामले में सही संख्या देंगे।
growlingchaos

27

उपकरण wcUNIX और UNIX- जैसे ऑपरेटिंग सिस्टम में "शब्द काउंटर" है, लेकिन आप -lविकल्प जोड़कर किसी फ़ाइल में लाइनों को गिनने के लिए भी इसका उपयोग कर सकते हैं ।

wc -l fooमें लाइनों की संख्या की गणना करेगा foo। आप इस तरह से एक कार्यक्रम से आउटपुट भी कर सकते हैं: ls -l | wc -lजो आपको बताएगा कि वर्तमान निर्देशिका (प्लस एक) में कितनी फाइलें हैं।


3
ls -l | wc -l वास्तव में आपको कुल आकार लाइन के लिए निर्देशिका +1 में फ़ाइलों की संख्या देगा। आप ls -ld * | wc -lफ़ाइलों की सही संख्या प्राप्त करने के लिए कर सकते हैं ।
जोशुआ लॉरेंस ऑस्टिल

24

यदि आप किसी निर्देशिका की सभी फ़ाइलों की कुल पंक्ति की जाँच करना चाहते हैं, तो आप खोज और wc का उपयोग कर सकते हैं:

find . -type f -exec wc -l {} +


15

यदि आप चाहते हैं कि लाइनों की संख्या (और लाइनों की संख्या नहीं है और बेवकूफ फ़ाइल नाम वापस आ रहा है):

wc -l < /filepath/filename.ext

जैसा कि पहले बताया गया है कि ये भी काम करते हैं (लेकिन अन्य कारणों से हीन हैं):

awk 'END{print NR}' file       # not on all unixes
sed -n '$=' file               # (GNU sed) also not on all unixes
grep -c ".*" file              # overkill and probably also slower

3
यह सवाल पूछे जाने के 3 साल बाद पोस्ट किया गया था और यह सिर्फ अन्य लोगों की नकल कर रहा है। पहला भाग तुच्छ है और दूसरा सभी भूतों का उत्तर जोड़ रहा है। Downvoting।
फेडोरक्वी 'SO

4 साल पर .. downvoting। चलो देखते हैं कि क्या हम एक दशक लंबे समय तक लकीर खींच सकते हैं!
डेमियन रोश

1
नहीं आप गलत हैं; घोस्टडॉग का उत्तर मूल प्रश्न का उत्तर नहीं देता है। यह आपको लाइनों की संख्या और फ़ाइल नाम देता है। केवल फ़ाइल नाम पाने के लिए आप कर सकते हैं: filename.wc -l </filepath/filename.ext। जिसके कारण मैंने उत्तर पोस्ट किया। awk, sed और grep ये सब करने के थोड़े हीन तरीके हैं। उचित तरीका वह है जिसे मैंने सूचीबद्ध किया है।
ggb667

8

nlइस तरह का उपयोग करें:

nl filename

से man nl:

प्रत्येक FILE को स्टैण्डर्ड नंबरों के साथ, मानक आउटपुट में लिखें। कोई फ़ाइल के साथ, या जब फ़ाइल है -, मानक इनपुट पढ़ें।


यह पहला उत्तर है जो मैंने पाया है कि एक ऐसी फ़ाइल के साथ काम करता है जिसमें एक ही पंक्ति का पाठ होता है जो एक नई पंक्ति में समाप्त नहीं होता है, जो wc -l0. के रूप में रिपोर्ट करता है। धन्यवाद।
स्कॉट जौड्री

7

मैं इसका उपयोग कर रहा हूं:

cat myfile.txt | wc -l

मैं इसे स्वीकार किए गए उत्तर पर पसंद करता हूं क्योंकि यह फ़ाइल नाम नहीं छापता है, और आपको इसे awkठीक करने के लिए उपयोग करने की आवश्यकता नहीं है । स्वीकृत उत्तर:

wc -l myfile.txt

लेकिन मुझे लगता है कि GGB667 का सबसे अच्छा जवाब है:

wc -l < myfile.txt

मैं शायद अब से इसका उपयोग करूंगा। यह मेरे रास्ते से थोड़ा छोटा है। मैं अपना पुराना तरीका यह कर रहा हूं कि कोई इसे पसंद करे। आउटपुट उन दो विधियों के साथ समान है।


3
पहली और अंतिम विधि समान हैं। पिछले एक बेहतर है क्योंकि यह एक अतिरिक्त प्रक्रिया नहीं है

5

ऊपर पसंदीदा तरीका है लेकिन "बिल्ली" कमांड भी मददगार हो सकती है:

cat -n <filename>

आपको लाइन नंबरों के साथ फाइल की पूरी सामग्री दिखाएगा।


5

जब मैंने एकाधिक फ़ाइलों की पंक्तियों को गिनने का तरीका खोजा, तो मैंने यह प्रश्न देखा, इसलिए यदि आप एक .txt फ़ाइल की कई फ़ाइल लाइनों को गिनना चाहते हैं, तो आप ऐसा कर सकते हैं।

cat *.txt | wc -l

यह एक .txt फ़ाइल पर भी चलेगा;)


5

wc -l लाइनों की गिनती नहीं है।

हां, यह जवाब पार्टी के लिए थोड़ा देर से हो सकता है, लेकिन मैंने अभी तक किसी को भी दस्तावेजों का जवाब में अधिक मजबूत समाधान नहीं मिला है।

आम धारणा के विपरीत, POSIX को नई लाइन वर्ण के साथ फ़ाइलों को समाप्त करने की आवश्यकता नहीं है। हाँ, एक POSIX 3.206 लाइन की परिभाषा इस प्रकार है:

शून्य या अधिक गैर- <newline> वर्णों के साथ-साथ एक समाप्ति वर्ण भी।

हालाँकि, बहुत से लोगों को इस बात की जानकारी नहीं है कि POSIX भी POSIX 3.195 अपूर्ण रेखा को परिभाषित करता है :

फ़ाइल के अंत में एक या अधिक गैर- <newline> वर्णों का एक क्रम।

इसलिए, एक अनुगामी के बिना फ़ाइलें LFपूरी तरह से POSIX- अनुरूप हैं।

यदि आप दोनों ईओएफ प्रकारों का समर्थन नहीं करने का चयन करते हैं, तो आपका कार्यक्रम पॉसिक्स-अनुरूप नहीं है।

एक उदाहरण के रूप में, आइए निम्न फ़ाइल को देखें।

1 This is the first line.
2 This is the second line.

कोई बात नहीं ईओएफ, मुझे यकीन है कि आप सहमत होंगे कि दो लाइनें हैं। आपने यह पता लगाया कि कितनी लाइनें शुरू हुई हैं, यह देखकर नहीं कि कितनी लाइनों को समाप्त किया गया है। दूसरे शब्दों में, POSIX के अनुसार, इन दोनों फ़ाइलों में दोनों समान लाइनें हैं:

1 This is the first line.\n
2 This is the second line.\n
1 This is the first line.\n
2 This is the second line.

मैन पेज अपेक्षाकृत wcनए 0x0aवर्णों की गिनती के बारे में स्पष्ट है, जिसमें एक नई लाइन सिर्फ एक चरित्र है:

NAME
       wc - print newline, word, and byte counts for each file

इसलिए, wcयह गिनने का भी प्रयास नहीं करता कि आप "लाइन" को क्या कह सकते हैं। wcगणना लाइनों का उपयोग करने से आपकी इनपुट फ़ाइल के ईओएफ के आधार पर बहुत अच्छी तरह से मिसकाउंट हो सकते हैं।

POSIX- अनुरूप समाधान

आप ऊपर दिए गए उदाहरण में लाइनोंgrep को गिनने के लिए उपयोग कर सकते हैं । यह समाधान अधिक मजबूत और सटीक है, और यह सभी विभिन्न स्वादों का समर्थन करता है जो आपकी फ़ाइल में एक रेखा हो सकती है:

$ grep -c ^ FILE

4
cat file.log | wc -l | grep -oE '\d+'
  • grep -oE '\d+': अंकों की संख्या को केवल वापस करने के लिए ।


3

फ़ाइल के आउटपुट को पुनर्निर्देशन / पाइपिंग wc -lमें निम्नलिखित की तरह पर्याप्त होना चाहिए:

cat /etc/fstab | wc -l

जो तब नं। केवल लाइनों की।


3

या फ़ाइल नाम पैटर्न (जैसे फ़ाइल नाम में टाइमस्टैम्प के साथ लॉगफ़ाइल्स) के साथ उपनिर्देशिकाओं में सभी पंक्तियों की गणना करें:

wc -l ./**/*_SuccessLog.csv

2

मुझे पता है कि यह पुराना है, लेकिन अभी भी: फ़िल्टर्ड लाइनों की गणना करें

मेरी फ़ाइल दिखती है:

Number of files sent
Company 1 file: foo.pdf OK
Company 1 file: foo.csv OK
Company 1 file: foo.msg OK
Company 2 file: foo.pdf OK
Company 2 file: foo.csv OK
Company 2 file: foo.msg Error
Company 3 file: foo.pdf OK
Company 3 file: foo.csv OK
Company 3 file: foo.msg Error
Company 4 file: foo.pdf OK
Company 4 file: foo.csv OK
Company 4 file: foo.msg Error

अगर मैं जानना चाहता हूं कि कितनी फाइलें भेजी जाती हैं:

grep "OK" <filename> | wc -l

या

grep -c "OK" filename


1

जैसा कि दूसरों ने कहा कि wc -lयह सबसे अच्छा समाधान है, लेकिन भविष्य के संदर्भ के लिए आप पर्ल का उपयोग कर सकते हैं:

perl -lne 'END { print $. }'

$.लाइन नंबर शामिल है और ENDस्क्रिप्ट के अंत में ब्लॉक निष्पादित करेगा।


1
काम नहीं करता है:dir | perl -lne 'END { print $. }' Can't find string terminator "'" anywhere before EOF at -e line 1.'
VeikkoW

1
@VeikkoW मेरे लिए काम करता है। यदि आप विंडोज पर हैं, तो अलग-अलग उद्धरण नियम लागू होते हैं; लेकिन ओपी ने लिनक्स / बैश के बारे में पूछा।
15

1
perl -lne '}{ print $. 'वही करता है।
टॉम फेन्च

1

मैंने सिर्फ ऐसा करने के लिए एक कार्यक्रम बनाया (साथ node)

npm install gimme-lines
gimme-lines verbose --exclude=node_modules,public,vendor --exclude_extensions=html

https://github.com/danschumann/gimme-lines/tree/master


4
बगीचे की मातम को मारने के लिए F16 का उपयोग करना पसंद नहीं है?
बुटेल बटुकस

1

wc -l <filename>

यह आपको आउटपुट में लाइनों और फ़ाइल नाम की संख्या देगा।

उदाहरण के लिए।

wc -l 24-11-2019-04-33-01-url_creator.log

उत्पादन

63 24-11-2019-04-33-01-url_creator.log

उपयोग

wc -l <filename>|cut -d\ -f 1

आउटपुट में केवल पंक्तियों की संख्या प्राप्त करने के लिए।

उदाहरण के लिए।

wc -l 24-11-2019-04-33-01-url_creator.log|cut -d\ -f 1

उत्पादन

63


स्वीकृत (दस वर्ष) उत्तर को दोहराने का लाभ कहां है?
जेब

क्योंकि मुझे इस थ्रेड में आउटपुट में केवल लाइन नंबर प्राप्त करने की कमांड नहीं मिली।
हर्ष सरोही

यह स्वीकृत उत्तर में दूसरा उदाहरण है। wc -l < filename
जेब

wc -l <filename> फ़ाइल नाम के साथ-साथ आउटपुट में लाइनों की संख्या भी देता है।
हर्ष सरोही

नहीं, wc -l < filename से अलग है wc -l filename, पहले उपयोग पुनर्निर्देशन करता है और फिर आउटपुट में कोई फ़ाइल नाम नहीं है, जैसे कि उपयोगकर्ता85509 से उत्तर
जेब

1

यह ड्रॉप-इन पोर्टेबल शेल फ़ंक्शन [shell]   एक आकर्षण की तरह काम करता है। बस अपनी .bashrcफ़ाइल में निम्नलिखित स्निपेट जोड़ें (या अपने शेल वातावरण के लिए बराबर)

# ---------------------------------------------
#  Count lines in a file
#
#  @1 = path to file
#
#  EXAMPLE USAGE: `count_file_lines $HISTFILE`
# ---------------------------------------------
count_file_lines() {
    local subj=$(wc -l $1)
    subj="${subj//$1/}"
    echo ${subj//[[:space:]]}
}

यह पूरी तरह से बैश और zsh के अलावा सभी POSIX- संगत गोले के साथ संगत होना चाहिए ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.