10

For example, we want to count all quote (") characters; we just worry if files have more quotes than it should.

For example:

cluster-env,"manage_dirs_on_root","true"
cluster-env,"one_dir_per_partition","false"
cluster-env,"override_uid","true"
cluster-env,"recovery_enabled","false"

expected results:

16

20

You can combine tr (translate or delete characters) with wc (count words, lines, characters):

tr -cd '"' < yourfile.cfg | wc -c

(-delete all characters in the complement of ", and then count the characters.)

14

grep approach:

grep -o '"' file | wc -l
16 
  • -o - output only matched substrings

Or with single gawk:

awk -v RS='' -v FPAT='"' '{print NF}' file
16
  • RS='' - empty record separator (instead of newline)

  • FPAT='"' - pattern defining field value

4

If two lines in the file has an odd number of double quotes, the total sum of double quotes will be even, and you will not detect unbalanced quotes (this is what I presume you'd like to actually do, but I might be wrong).

This awk script reports any line in the input line that has an odd number of quotes:

awk -F'"' 'NF % 2 == 0 { printf("Line %d has odd quoting: %s\n", NR, $0) }'

We set the field separator (FS) to " with -F'"' which means that if a line has an even number of fields it has odd quotes. NF is the number of fields in the recent record, and NR is the ordinal number of the current record ("the line number").

Given the following input:

$ cat file
cluster-env,"manage_dirs_on_root","true"
cluster-env,"one_dir_per_partition","false"
cluster-env,override_uid","true"
cluster-env,recovery_enabled","false"

we get

$ awk -F'"' 'NF % 2 == 0 { printf("Line %d has odd quoting: %s\n", NR, $0) }' file
Line 3 has odd quoting: cluster-env,override_uid","true"
Line 4 has odd quoting: cluster-env,recovery_enabled","false"

Something like

$ grep -o '"' | wc -l

would return "14" for this file.

2

Another single gawk approach:

awk -v RS=\" 'END{print NR-1}'
2

Pure BASH:

var="$(< file.txt)"
tmp="${var//[^\"]/}"
echo ${#tmp}
  • Is tmp an array? If yes, tmp is an array of what? – Tim Aug 23 '17 at 0:14
  • @Tim, no. tmp in this snippet is a normal shell variable. And I'm downvoting this answer because this counts the number of times a character appears in a variable (var) rather than in a file as specified in the question. – Wildcard Aug 23 '17 at 3:33
0

try:

grep -0 '"' File -c

however, this will not work if two or more char in the same line. They will be counted as one char

  • 1
    Welcome on U&L! This doesn't seem to actually answer the question, since it will count lines instead of characters. Writing effective answers is strongly encouraged on U&L - see Answering in the help center. You might want to improve this one. – fra-san Dec 1 '18 at 20:12
0

grep -oF ' " ' file | wc -l

-F stands for fixed string

0

Eccentric double GNU grep method:

grep -o \" file | grep -c .

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.